クラスが演算子@Inject
で初期化されているときにオブジェクトがnullである理由を誰でも説明できますか?new
public class A{
@Inject
B b;
...
...
}
上記のクラスが作成されるA a = new A();
とb
、null
. 誰でも理由を説明できますか?クラスAを注入すると機能することはわかっていますが、新しい演算子では機能しない理由を知りたいです。春は何をしますか?
Spring は、それ自体が作成しない Bean の依存関係を自動配線する機会がありません。依存性注入は、Spring コンテナーによって処理される必要があります。を使用new
してオブジェクトを作成する場合は、Spring コンテナーをまったく使用していません。自分でインスタンスを作成する代わりに、オブジェクトのコンテナーを要求する必要があります。このようにして、コンテナはそのオブジェクトのライフサイクルにフックを持ちます。
A a = new A();
このように、によって参照されるオブジェクトa
は Spring によって管理されません。したがって、依存オブジェクトを に注入することはできませんa
。
A
次のように、コンテナからのインスタンスを取得する必要があります。
ClassPathXmlApplicationContext context =
new ClassPathXmlApplicationContext("applicationContext.xml");
A a = context.getBean("myBean");
PS: -文脈から外れていますが、このブログto-new-or-not-to-newは読みやすいです。
インジェクターはどのように気づき、行動することになっていnew
ますか? 傍受できない言語操作です。
B は、Spring が作成する Bean に注入されます。
A a = new A();
これはSpringによって作成されたものではなく、Spring Beanではありません。
context.xml で、タイプ A の Bean を作成し、それを使用する必要があります。
春のエンティティマネージャーへの静的アクセスと異常なアーキテクチャ (誰かこのリンクを最後の段落に移動してください。私の電話では、正しい場所に貼り付けることは不可能です)
クラスに @Configurable を追加します。次に、通常の new で作成された場合でも、Spring はこのクラスに注入します。
ただし、これには実際の AspectJ が必要です。
詳細については、この質問と回答 (冒頭のリンク) を参照してください。
そのように見えますが、注射はそれほど魔法ではありません。「new」でインスタンスを作成すると、コンストラクターが呼び出され、コンストラクター内のコードが処理されるだけです。
値が挿入されたクラスのインスタンスを取得する方法は、使用しているテクノロジによって異なります。