생성자 주입을 사용하는 경우 구문 분석 할 수없는 원형 의존성 시나리오가 생성 될 수 있습니다.
원형 의존성이란 무엇입니까?
원형 의존성은 실제로 원형 기준, 즉 둘 이상의 콩이 서로를 잡고 결국 폐쇄 루프를 형성합니다. 예를 들어, a는 b에 의존하고, b는 c에 의존하고, c는 A에 따라 다릅니다. 아래 그림과 같이.
이것은 함수에 대한 루프 호출이 아니라 객체의 상호 의존성입니다. 최종 조건이없는 한 루프 호출은 실제로 죽은 루프입니다.
봄에는 루프 종속성 시나리오가 있습니다.
(1) 생성자의 원형 의존성 (2) 필드 속성의 원형 의존성.
원형 의존성이 있는지 감지하는 방법
원형 의존성을 감지하는 것은 비교적 쉽습니다. 콩이 만들어지면 콩을 표시 할 수 있습니다. 재귀 호출이 돌아와서 그것이 생성되고 있음을 알게되면 원형 의존성이 의미합니다.
여기에 내가 겪은 상황은 다음과 같습니다. 코드 구조는 다음과 같습니다.
Springsecurity 구성 클래스 :
@ConfigurationPublic Class BrowserSecurityConfig 확장 WebSecurityConfigurerAdapter {private final userDetailSService userDetailSService; / ** * 구성 클래스 생성자를 통해 userDetailsService를 주입하십시오 */ @autowired public browsersecurityconfig (userDetailSService userDetailSService) {this.userDetailSService = userDetailSService; } / ** * 구성 클래스에서 암호화 인코더를 선언 * / @bean public popply cademportencoder passwordEncoder () {return new bcryptpasswordencoder (); } ... ...}userDetailsService 클래스 :
@ComponentPublic Class MyUserDetailService 구현 userDetailSService {private final passwordencoder passwordEncoder; 개인 로거 로거 = loggerfactory.getLogger (getClass ()); / ** * 생성자를 통해 PasswordEncoder를 주입하십시오 */ @autowired public myuserDetailService (PasswordEncoder passwordencoder) {this.passwordencoder = passwordencoder; } ... ...}실행 후 Spring은 다음 오류 메시지를 던집니다.
설명:
응용 프로그램 컨텍스트에서 일부 Bean의 종속성은주기를 형성합니다.
┌ ──건고입니다
| 파일에 정의 된 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는 생성자를 통해 userDetailSService 인스턴스를 주입하고 사용자 데일 테일스 서비스가 생성자를 통해 BrowserSecurityConfig에서 선언 된 암호 검정기에 주입됩니다.
요약하면, 스프링 콩의 원형 의존성은 클래스 A가 클래스 B 인스턴스 (또는 b로 선언 된 Bean)를 생성자에 주입해야한다는 것을 의미하는 반면, 클래스 B는 클래스 A (또는 a) 인스턴스를 생성자에 주입해야한다는 것을 의미합니다. 클래스 A와 클래스 B의 Bean이 서로를 주입하도록 구성된 경우, Spring IOC 컨테이너는 런타임 에서이 루프 참조를 감지하고 BeanCurrenthinlyIncreationException을 높입니다. 일반적인 경우 (원형 의존성이없는)와 달리, 콩 A와 콩 B 사이의 원형 의존성은 콩 중 하나를 완전히 초기화하기 전에 다른 콩에 주입하도록 강요합니다 (이것은 일반적인 "닭 첫 번째 또는 계란 첫"시나리오입니다).
해결책
간단히 말해서, 생성자 기반 의존성 주입을 사용하지는 않습니다. 다음 방법으로 해결할 수 있습니다.
현장에서 @autowired 주석을 사용하고 Spring이 적시에 주입하기로 결정하게하십시오. 【추천하다】
원형 의존성을 해결하기 위해 생성자 기반 의존성 주입을 세터 기반 의존성 주입으로 교체하십시오.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.