원형 의존성
정의 : 원형 의존성은 원형 기준입니다. 즉, 둘 이상의 콩이 서로를 붙잡는 것을 의미합니다. 예를 들어, 원형은 원형을 말하고, 원형은 원형성을 나타내고, 원형은 원형성을 나타냅니다. 순환 참조 관계를 형성하십시오.
스프링을 사용하는 경우 주로 생성자 기반 종속성 주입 방법을 사용하면 원형 종속성이 발생할 수 있습니다. 요컨대, Bean A의 생성자는 Bean B에 따라 다르고 Bean B의 생성자는 Bean A에 따라 다릅니다.이 경우 스프링은 컴파일 시간에 BeancurrenthynlyincreationException을 던집니다.
클래스 A
@componentpublic classa classa {private classb classb; @autowired public classa (classb classb) {this.classb = classb; } public void printClass () {System.out.println ( "클래스 A =" + this); System.out.println ( "클래스 B =" + classB); }}클래스 b
@componentpublic class classb {private classa classa; @autowired public classb (classa classa) {this.classa = classa; } public void printclass () {System.out.println ( "클래스 A =" + classa); System.out.println ( "클래스 B =" + this); }}시험
@contextConfiguration (class = {classa.class, classb.class}) @Runwith (SpringRunner.class) 공개 클래스 MyTest {@autowired private classa classa; @autowired private classb classb; @test public void name () {classa.printclass (); classb.printclass (); }}이유
현재 BeancurrentyIncreationException 예외가 발생한다는 것을 알 수 있습니다. 그 이유는 스프링이 콩을 생성 할 때 먼저 물체를 인스턴스화 한 다음 종속성을 주입하기 때문입니다. Spring이 클래스 A를 먼저 생성 한 다음 생성자에 클래스 B 의존성이 있다는 것을 알게 될 것이므로 클래스 B를 생성 한 다음 클래스 B 생성자에서 클래스 A에 대한 종속성을 찾을 수 있습니다. 현재, 클래스 A는 초기화되지 않았으므로 클래스 A를 생성하는 것으로 전환됩니다.
해결책
세터 기반 의존성 주입으로 전환하면이 문제가 해결 될 수 있습니다. Setter 기반 종속성 주입은 먼저 기본 생성자를 호출하여 객체를 인스턴스화 한 다음 Setter를 호출하여 종속성 주입을 구현합니다. 이런 식으로, 객체의 인스턴스화 단계에는 의존성이 없습니다. 따라서 클래스 A가 인스턴스화 된 후 클래스 B가 호출되고 클래스 B가 인스턴스화 된 후 값을 설정하기 시작합니다. 현재 A 클래스 A는 이미 인스턴스화되므로 클래스 A를 성공적으로 참조 할 수 있습니다.
요약
위는이 기사의 전체 내용입니다. 이 기사의 내용에 모든 사람의 연구 나 작업에 대한 특정 참조 가치가 있기를 바랍니다. 궁금한 점이 있으면 의사 소통을 위해 메시지를 남길 수 있습니다. Wulin.com을 지원 해주셔서 감사합니다.