0

と の 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ます。したがって、この回避策は私には見苦しく見えます。上記の依存性注入の問題に対する解決策があれば、最初の方法を使用したいと思います。

工場でインスタンス化されたコンポーネントに依存関係を注入する方法はありますか?

4

1 に答える 1