7

2 つのクラスがあるとします。1 つ目は、プロパティ、フィールド、または注釈のないクラスです。

public class B {}

そして、次のように B を注入するクラス:

public class A {
    @Inject
    private B b;

    public B getB() {
        return b;
    }
}

クラス A は、使用するまではほとんど役に立たないため、2 つのオプションがあります。

  • @注入する
  • 信頼できる「new A()」を使用して、手動で構築します

A が注入された場合、CDI はそれを管理し、@Dependent の暗黙的なスコープを持つ B を注入するのに十分親切です。かっこいい、まさに私が欲しいもの。

ただし、手動で A を作成すると (たとえば、ファクトリまたはビルダーで)、CDI はオブジェクトを完全に無視し、タイプ B のオブジェクトを挿入しません。

私が話している例は、それが機能しない場合です。ここでは、オブジェクト a は常に null のままです。

public class Builder {
    @Inject
    private A a;

    public static Builder ofTypeSomething() {
        // do some magic here
        return new Builder();
    }

    private Builder() {
        // and some more here
    }
}

なぜこれが機能しないのですか?

クラス A は有効なマネージド Bean であり、クラス B と同様に有効なスコープを持っています。静的メソッドに @Producer を追加しても、何も変更されません (これは問題ありません。静的メソッドの考え方は、 Builder をどこにも注入しないでください)。

4

1 に答える 1

9

依存性注入は便利ですが、魔法のようなものではありません。DI のしくみは、コンテナーにオブジェクトのインスタンスを要求すると、コンテナーは最初にそれを ( 経由でnew()) 構築し、次に依存関係を設定します (これがどのように発生するかは、フレームワークによって異なります)。

エンティティを自分で構築した場合、コンテナはエンティティを構築したことを認識せず、エンティティの依存関係を設定できません。

ファクトリを使用する場合、ほとんどのフレームワークにはエンティティを構成する何らかの方法があり、コンテナはエンティティのコンストラクタを呼び出さずに静的ファクトリ メソッドを呼び出す必要があります。ただし、コンテナからエンティティを取得する必要があります。

編集:このサイトは、CDI でファクトリを使用する方法を示しているようです。

于 2011-02-01T21:45:42.603 に答える