有兩個類,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