円形依存関係
定義:円形の依存関係は円形の参照です。つまり、2つ以上の豆が互いに保持していることを意味します。たとえば、CircularityaはCircularityBを指し、CircularityBはCircularityCを指し、CircularityCはCircularityaを指します。円形の参照関係を形成します。
Springを使用する場合、主にコンストラクターベースの依存関係注入法を使用する場合、円形の依存関係に遭遇する可能性があります。要するに、Bean AのコンストラクターはBean Bに依存し、Bean BのコンストラクターはBean Aに依存します。
クラスA
@componentpublic classa {private classb classb; @autowired public classa(classb classb){this.classb = classb; } public void printclass(){system.out.println( "class a =" + this); System.out.println( "class b =" + classb); }}クラスb
@componentpublic class classb {private classa classa; @autowired public classb(classa classa){this.classa = classa; } public void printclass(){system.out.println( "class a =" + classa); System.out.println( "class b =" + this); }}テスト
@contextconfiguration(classes = {classa.class、classb.class}) @runwith(springrunner.class)パブリッククラスmytest {@autowired private classa classa; @autowired private classb classb; @test public void name(){classa.printclass(); classb.printclass(); }}理由
現時点では、BeanCurlentsIncreationExceptionの例外がスローされていることがわかります。この理由は、スプリングが豆を作成すると、最初にオブジェクトをインスタンス化し、依存関係を挿入するためです。 Springが最初にクラスAを作成すると仮定し、その後、コンストラクターにクラスB依存関係があることがわかります。そのため、クラスBを作成し、クラスBのコンストラクターでクラスAへの依存関係を見つけることができます。
解決
セッターベースの依存関係噴射に切り替えると、この問題を解決できます。セッターベースの依存関係インジェクションは、最初にデフォルトのコンストラクターを呼び出してオブジェクトをインスタンス化し、次にセッターを呼び出して依存関係噴射を実装します。このようにして、オブジェクトのインスタンス段階に依存関係はありません。したがって、クラスAがインスタンス化された後、クラスBが呼び出され、クラスBがインスタンス化された後、値の設定を開始します。この時点で、クラスAはすでにインスタンス化されているため、クラスAを正常に参照できます。
要約します
上記は、この記事のコンテンツ全体です。この記事の内容には、すべての人の研究や仕事に特定の参照値があることを願っています。ご質問がある場合は、メッセージを残してコミュニケーションをとることができます。 wulin.comへのご支援ありがとうございます。