Spring Bernの循環依存解を詳細に説明する。


構造関数注入を使用すると,解析不能な循環依存シナリオが作成されるかもしれない。
何が循環依存ですか?
循環依存とは循環参照、つまり2つ以上のbeanが互いに相手を持ち、最終的には閉ループを形成することである。例えばAはBに依存し、BはCに依存し、CはAに依存する。次の図のように

ここでは関数の循環呼び出しではなく、オブジェクトの相互依存関係です。循環呼び出しは実は死循環です。終了条件がない限り。
Springでのサイクル依存シーンは、
(1)コンストラクタの循環依存性
(2)field属性のサイクル依存性。
循環依存があるかどうかをどう検出しますか?
検出サイクル依存性は比較的容易であり、ビーンは作成時にビーコンをビーコンし、再帰的呼び出しが戻ってきたら作成中であることが判明すれば、サイクル依存性を説明している。
以下は私が遭遇した状況です。コード構造は以下の通りです。
SprigSecurity配置クラス:

@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
  private final UserDetailsService userDetailsService;

  /**
   *             UserDetailsService
   */  
  @Autowired
  public BrowserSecurityConfig(UserDetailsService userDetailsService) {
    this.userDetailsService = userDetailsService;
  }

  /**
   *              
   */
  @Bean
  public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
  }

  ... ...
}

UserDetails Service類:

@Component
public class MyUserDetailService implements UserDetailsService {
  private final PasswordEncoder passwordEncoder;

  private Logger logger = LoggerFactory.getLogger(getClass());

  /**
   *          PasswordEncoder 
   */  
  @Autowired
  public MyUserDetailService(PasswordEncoder passwordEncoder) {
    this.passwordEncoder = passwordEncoder;
  }
  ... ...
}

運転後、Springは以下のエラーメッセージを投げました。
Description:
The dependencies of some of the beans in the appration context form a cycle:
ゞ——蛰
𞓜  browserSecurityConfig defined in file[D:\CODE\Java\IdeaProject\mango-security\manno-security-browser\targes\stu\mago\security\browsecurity\browserSecurity\browty\browsecurity
↑     ↓
𞓜  myUserDetail Service defined in file[D:\CODE\Java\IdeaProject\manto-security\manto-security-browser\taget\stu\mago\security\browsery\myUserDeiltavicelass]
一羽の剣———┘
この例では、BrowserSecurityConfigは、構造関数によってUserDetails Serviceの例を注入し、UserDetails Serviceは、ビルド関数によってBrowserSecurityConfigに注入されて宣言されたPassword Encerderによって行われる。
要約すると、Spring Beanの循環依存性は、クラスAが構造関数によって注入されるクラスBの例(またはBにおいて宣言されたBean)を必要とし、クラスBは構造関数によって注入されるクラスAの例(またはAにおいて宣言されたBean)を必要とすることである。クラスAとクラスBのbeanを相互注入に配置すると、Spring IoC容器はこのサイクル参照を検出して、BeanCurrenntlyInCreationExceptionを誘発します。典型的な場合(循環依存性がない)とは異なり、bean Aとbean Bとの間の循環依存関係は、完全に初期化される前に他のbeanに注入される(これは典型的な「ニワトリが先か卵が先か」というシーンである)。
ソリューション
簡単に要約すると、つまり構造関数に基づく依存注入を使用しないです。次のように解決できます。
フィールドに@Autowired注解を使用して、Springが適切なタイミングで注入することを決定します。おすすめ)
構造関数に基づく依存注入をsetter法による依存注射で置換して循環依存性を解いた。
以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。