有两个类,Foo
和,在我的应用程序中Bar
实现了一些接口。我正在尝试建立一个使用这两个类之一有条件地实现的类型的组件。为此,我创建了一个工厂组件,使用或依赖于字段值进行实例化:Baz
Seam 2.2.2
Baz
BazFactory
Baz
Foo
Bar
implClassName
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
实现再创建一个组件。因此,这种解决方法对我来说看起来很难看。如果有上述依赖注入问题的解决方案,我更喜欢使用第一种方式。
有没有办法将依赖项注入工厂实例化的组件?