2013-07-31 81 views
0

有两个类,FooBar,在我的Seam 2.2.2供电应用程序中实现了一些接口Baz。我试图建立一个Baz类型的组件,这些组件有条件地使用这两个类中的一个来实现。为了这个目的,我创建了一个工厂组件,BazFactory,实例化Baz与根据implClassName字段的值FooBar工厂实例化组件中的依赖注入

public interface Baz {...} 

public class Foo implements Baz { 

    @In 
    String injectedValue1; 

    ... 
} 

public class Bar implements Baz { 

    @In 
    String injectedValue2; 

    ... 
} 

@Name("bazFactory") 
@Scope(value = ScopeType.SESSION) 
public class BazFactory { 

    private String implClassName; 

    public void setImplClassName(String implClassName) { 
     this.implClassName = implClassName; 
    } 

    @Factory(value="baz", scope = ScopeType.SESSION) 
    public Baz getBazImpl() throws Exception { 
     Class.forName(this.implClassName).newInstance(); 
    } 
} 

的问题是,它的依赖不会注入实例化类在这种情况下。我设计的唯一解决方法是声明FooBar的组件:

@Name("foo") 
@Scope(ScopeType.CONVERSATION) 
public class Foo implements Baz { 

    @In 
    String injectedValue1; 

    ... 
} 

@Name("bar") 
@Scope(ScopeType.CONVERSATION) 
public class Bar implements Baz { 

    @In 
    String injectedValue2; 

    ... 
} 

@Name("bazFactory") 
@Scope(value = ScopeType.SESSION) 
public class BazFactory { 

    private String implComponentName; 

    public void setImplComponentName(String implComponentName) { 
     this.implComponentName = implComponentName; 
    } 

    @Factory(value="baz", scope = ScopeType.SESSION) 
    public Baz getBazImpl() { 
     return (Baz) Component.getInstance(this.implComponentName); 
    } 
} 

然而,在这种情况下,有一个与范围类型一团糟。例如,如何定义一个在其声明中具有@Scope(ScopeType.CONVERSATION)的组件并在声明实例化该组件的工厂方法(如上例中)时声明scope = ScopeType.SESSION?此外,解决方法还包括为每个Baz实施创建一个更多组件。因此,这种解决方法对我来说看起来很难看。如果有解决上述依赖注入问题的方法,我宁愿使用第一种方法。

有没有办法将依赖注入工厂实例化的组件?

回答

0

您可以用更简单的方法实现同样的目的。 在您的工厂中,您不应该使用Class.forName()。newInstance()创建新实例。

在另一只手放在上下文中的文件,你可以有豆子一样

<bean id="bar" class="com.techidiocy.Bar"/> 
<bean id="foo" class="com.techidiocy.Foo"/> 

假设:的酒吧和Foo所需的属性将被装配或手动注射。

在您的工厂中,您可以使用该上下文文件并通过传递bean名称来获取该上下文文件,因为您已在工厂中获取该文件。

ApplicationContext context = new ClassPathXmlApplicationContext 
     ("classpath:context.xml"); 

return context.getBean(implClassName);//implClassName is the input that you are receiving in factory 

以这种方式,您可以返回所需的实现类型,取决于您在工厂类中接收到的输入。

谢谢

+0

如果我没有弄错,这个解决方案是为了Spring框架。我的问题被引用到Seam Framework 2.2.2,而不是Spring。 – vect

+0

哦对不起,我的坏意味着只有春天,我完全失去了它。 我会删除我的答案。 - 感谢您指出。 – saurav

+0

无论如何,谢谢你的努力:) – vect