コンストラクターインジェクションが使用される場合、解析できない円形の依存シナリオを作成できます。
循環依存とは何ですか
円形依存性は実際には円形の参照です。つまり、2つ以上の豆が互いに保持し、最終的に閉ループを形成します。たとえば、aはb、bに依存します。bはcに依存し、cはAに依存します。
これは関数へのループコールではなく、オブジェクトの相互依存性であることに注意してください。ループ呼び出しは、エンド条件がない限り、実際にはデッドループです。
春にはループ依存性シナリオがあります:
(1)コンストラクターの円形依存性(2)フィールド属性の円形依存性。
円形の依存性があるかどうかを検出する方法
円形の依存関係を検出するのは比較的簡単です。豆が作成されると、豆をマークできます。再帰的な呼び出しが戻ってきて、それが作成されていることを発見した場合、それは円形の依存性があることを意味します。
これが私が遭遇した状況です。コード構造は次のとおりです。
SpringseCurity Configurationクラス:
@configurationPublic class browsersecurityconfig websecurityconfigurerAdapter {private finaldetailsService userdetailsService; / ** * configuration class constructorを介してuserdetailsserviceを注入 */ @autowired public browsersecurityconfig(userdetailsservice userdetailsservice){this.userdetailsservice = userdetailsservice; } / ** *構成クラスで暗号化エンコーダーを宣言します * / @bean publicsedencoder passwordencoder(){return new bcryptpasswordencoder(); } ...}userdetailsServiceクラス:
@componentPublic Class MyUserDetailServiceを実装しているuserdetailsservice {private final passwordencoder passwordencoder; Private Logger Logger = loggerFactory.getLogger(getClass()); / ** * constructorを介してpasswordEncoderを注入 */ @autowired public myuserdetailservice(passwordencoder passwordencoder){this.passwordencoder = passwordencoder; } ...}実行後、Springは次のエラーメッセージをスローします。
説明:
アプリケーションコンテキスト内の一部の豆の依存関係は、サイクルを形成します。
┌┌)
| browsersecurityconfigファイル[d:/code/java/ideaprojects/mango-security/mango-security-browser/target/classes/stu/mango/security/browser/browsersecurityconfig.class]
↑↓
|ファイルで定義されたmyuserdetailservice [d:/code/java/ideaprojects/mango-security/mango-security-browser/target/classes/stu/mango/security/browser/myuserdetailservice.class]
└└)
この例では、browsersecurityconfigは、Constructorを介してuserdetailsServiceインスタンスを挿入し、userdetailsServiceがコンストラクターを介してbrowsersecurityconfigで宣言されたpasswordencoderに注入されます。
要約すると、スプリングビーンの円形依存性は、クラスAがクラスB(またはBで宣言された豆)をコンストラクターに注入する必要があることを意味しますが、クラスBはクラスA(またはAで宣言されたBean)のインスタンスをコンストラクターに注入する必要があります。クラスAとクラスBの豆が互いに注入するように構成されている場合、Spring IOCコンテナは実行時にこのループ参照を検出し、beancurlentsincreationexceptionを上げます。典型的なケース(円形の依存関係なし)とは異なり、豆Aと豆Bの間の円形の依存性は、一方の豆の1つを他方に注入してから完全に初期化することを強制します(これは典型的な「チキンファーストまたは卵の最初の」シナリオです)。
解決
簡単に言えば、コンストラクターベースの依存関係注入を使用しないことです。次の方法で解決できます。
フィールドで@autowiredアノテーションを使用し、Springに適切なタイミングで注入することを決定させます。 【推薦する】
コンストラクターベースの依存関係注射をセッターベースの依存関係注射に置き換えて、円形の依存関係を解きます。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。