と の 2 つのクラスがありFoo
、私の動力を与えられたアプリケーションにBar
いくつかのインターフェースを実装しています。これら 2 つのクラスのいずれかで条件付きで実装されるタイプのコンポーネントを確立しようとしています。この目的のために、フィールドの値を使用して、またはフィールドの値に応じてインスタンス化するファクトリ コンポーネント を作成しました。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
andBar
をコンポーネントとして宣言することです。
@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
、このコンポーネントをインスタンス化するファクトリ メソッドの宣言に含まれるコンポーネントのスコープはどのようになりますか (上記の例のように)。さらに、回避策として、実装ごとにもう 1 つのコンポーネントを作成する必要がありBaz
ます。したがって、この回避策は私には見苦しく見えます。上記の依存性注入の問題に対する解決策があれば、最初の方法を使用したいと思います。
工場でインスタンス化されたコンポーネントに依存関係を注入する方法はありますか?