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 レベルのキャッシュです。
テストのスクリーンショットは次のとおりです。
通常の呼び出しも含め、ここでテストしたものはすべて正常です。
ただし、コンストラクター インジェクションを使用すると、図に示すように無限ループになります。