@Autowired(required=false) および @Reference(check = false) インジェクションに関する注意すべき問題

1 はじめに

Springを使用した開発プロセスでは、基本的に@Autowiredアノテーションを使用して既存のBeanを注入します。しかし、場合によっては注射が失敗することもあります。パラメータ(required=false)を追加すると解決できます。今日は実際の開発例をまとめてみました

2. 必須属性

@Autowired(required=true): @Autowired アノテーションを使用する場合、デフォルトは @Autowired(required=true) です。これは、注入時に Bean が存在する必要があり、そうでない場合は注入が失敗することを意味します。
ここに画像の説明を挿入します

@Autowired(required=false): 現在注入される Bean が無視されることを示します。直接注入がある場合、スキップされず、エラーは報告されません。

3. 使用する

ここに画像の説明を挿入します

ここに画像の説明を挿入します

通常の使用では、コントローラー層にサービスを挿入し、サービスにマッパーを挿入します。

ただし、特定の要素を挿入する必要があるパブリック メソッドがあり、このメソッドがパブリック モジュール内にある場合は、モジュールが他のプロジェクトに導入され、必要な Bean をプロジェクトに注入する必要がある場合、図 [2] に示すようなエラーが発生します。ここで問題が発生します。プロジェクトではクラスを注入する必要がないため、プロジェクト全体でエラーが報告されます。

4. 原因分析と解決策

コンテナーの起動プロセス中に、多くの Bean が初期化されます。これは Spring (IOC) のコアの 1 つでもあります。ただし、パブリックメソッドで注入するBeanは注入処理中にスキャンされて見つからないため、無理に注入すると注入に失敗します。メソッドだけを削除したり変更したりすることはできないため、Bean が存在する場合はそれを注入し、存在しない場合は注入しないという考えを採用します。解決策は @Autowired(required=false) です。

5. コンテナの親子関係

ログに示されているように:
ここに画像の説明を挿入します

ログを通じて、コンテナーの起動シーケンスを確認できます。

最初に親コンテナ (spring) をロードし、次に子コンテナ (springmvc) をロードします。したがって、サービスがコントローラーに注入されるとき、親コンテナー内の Bean は初期化されているため、注入は正常です。
親子コンテナでは、親コンテナの要素は子コンテナから見えますが、子コンテナの要素は親コンテナからは見えません。したがって、親コンテナは子コンテナの要素を取得できませんが、子コンテナは親コンテナの要素を取得できます。
現在のコンテナは現在のコンテナ内の要素を取得できます。これは、他のサービスをサービスに注入できることを意味します。

6. 問題の修正

これは、特に循環依存関係を解決するために Spring フレームワークによって提供される第 3 レベルのキャッシュです。

テストのスクリーンショットは次のとおりです。

ここに画像の説明を挿入します
ここに画像の説明を挿入します

通常の呼び出しも含め、ここでテストしたものはすべて正常です。

ただし、コンストラクター インジェクションを使用すると、図に示すように無限ループになります。

ここに画像の説明を挿入します

おすすめ

転載: blog.csdn.net/m0_49353216/article/details/108649779