5

クラスが演算子@Injectで初期化されているときにオブジェクトがnullである理由を誰でも説明できますか?new

public class A{
    @Inject
    B b;
    ...
    ...
}

上記のクラスが作成されるA a = new A();bnull. 誰でも理由を説明できますか?クラスAを注入すると機能することはわかっていますが、新しい演算子では機能しない理由を知りたいです。春は何をしますか?

4

6 に答える 6

8

依存性注入はスプリング コンテナーによって処理されるため、コンテナーによって作成されたオブジェクトのみが適用されます。

この場合、newオペレーターを使用して手動でオブジェクトを作成しているため、Spring コンテナーはオブジェクトの作成について認識しません。

可能な解決策は、ドキュメント@Configurableに記載されているように、注釈 (および AspectJ) を使用してこれを解決することです。

こちらの回答もご覧ください

于 2013-06-18T07:22:23.670 に答える
4

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は読みやすいです。

于 2013-06-18T07:22:51.667 に答える
0

インジェクターはどのように気づき、行動することになっていnewますか? 傍受できない言語操作です。

于 2013-06-18T07:21:35.587 に答える
0

B は、Spring が作成する Bean に注入されます。

A a = new A();

これはSpringによって作成されたものではなく、Spring Beanではありません。

context.xml で、タイプ A の Bean を作成し、それを使用する必要があります。

于 2013-06-18T07:22:34.483 に答える
0

春のエンティティマネージャーへの静的アクセスと異常なアーキテクチャ (誰かこのリンクを最後の段落に移動してください。私の電話では、正しい場所に貼り付けることは不可能です)

クラスに @Configurable を追加します。次に、通常の new で作成された場合でも、Spring はこのクラスに注入します。

ただし、これには実際の AspectJ が必要です。

詳細については、この質問と回答 (冒頭のリンク) を参照してください。

于 2013-06-18T09:16:56.570 に答える
0

そのように見えますが、注射はそれほど魔法ではありません。「new」でインスタンスを作成すると、コンストラクターが呼び出され、コンストラクター内のコードが処理されるだけです。

値が挿入されたクラスのインスタンスを取得する方法は、使用しているテクノロジによって異なります。

于 2013-06-18T07:24:31.557 に答える