Java 工厂实例化组件中的依赖项注入
有两个类,Java 工厂实例化组件中的依赖项注入,java,dependency-injection,seam,factory,seam2,Java,Dependency Injection,Seam,Factory,Seam2,有两个类,Foo和Bar,在我的Seam 2.2.2应用程序中实现了一些接口Baz。我试图建立一个Baz类型的组件,该组件有条件地使用这两个类中的一个实现。为此,我创建了一个工厂组件,BazFactory,根据implClassName字段的值,用Foo或Bar实例化Baz: public interface Baz {...} public class Foo implements Baz { @In String injectedValue1; ... } p
Foo
和Bar
,在我的Seam 2.2.2
应用程序中实现了一些接口Baz
。我试图建立一个Baz
类型的组件,该组件有条件地使用这两个类中的一个实现。为此,我创建了一个工厂组件,BazFactory
,根据implClassName
字段的值,用Foo
或Bar
实例化Baz
:
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();
}
}
问题是,在这种情况下,依赖项不会被注入到实例化的类中。我设计的唯一解决方法是将Foo
和Bar
声明为组件:
@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
实现多创建一个组件。因此,这个变通方法对我来说很难看。如果有解决上述依赖注入问题的方法,我更愿意使用第一种方法
有没有一种方法可以将依赖项注入工厂实例化的组件?您可以用更简单的方法实现同样的事情。 在工厂中,不应使用Class.forName().newInstance()创建新实例 另一方面,在您的上下文文件中,您可以像
<bean id="bar" class="com.techidiocy.Bar"/>
<bean id="foo" class="com.techidiocy.Foo"/>
通过这种方式,您可以根据在factory类中接收的输入返回所需的实现类型
谢谢如果我没有弄错的话,这个解决方案是针对Spring框架的。我的问题是指Seam框架2.2.2,而不是Spring。哦,对不起,我的问题是,它只针对Spring,我完全失去了它。我将删除我的答案谢谢你指出这一点。
ApplicationContext context = new ClassPathXmlApplicationContext
("classpath:context.xml");
return context.getBean(implClassName);//implClassName is the input that you are receiving in factory