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 をどこにも注入しないでください)。