有两个类,Foo
和Bar
,在我的Seam 2.2.2
供电应用程序中实现了一些接口Baz
。我试图建立一个Baz
类型的组件,这些组件有条件地使用这两个类中的一个来实现。为了这个目的,我创建了一个工厂组件,BazFactory
,实例化Baz
与根据implClassName
字段的值Foo
或Bar
:工厂实例化组件中的依赖注入
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
实施创建一个更多组件。因此,这种解决方法对我来说看起来很难看。如果有解决上述依赖注入问题的方法,我宁愿使用第一种方法。
有没有办法将依赖注入工厂实例化的组件?
如果我没有弄错,这个解决方案是为了Spring框架。我的问题被引用到Seam Framework 2.2.2,而不是Spring。 – vect
哦对不起,我的坏意味着只有春天,我完全失去了它。 我会删除我的答案。 - 感谢您指出。 – saurav
无论如何,谢谢你的努力:) – vect