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