2012-07-25 2 views
2

나는 생성자 삽입을 사용하여 생성 된 스프링 빈 집합을 가지고있다. (의도적으로) 다른 빈에 대한 순환 참조가 있으므로 다른 빈에 대한 참조를 주입하기 위해 일단 작성된 빈을 사후 처리하려고합니다.모든 빈이 생성 된 후 스프링 설정 기 의존성 삽입

BeanPostProcessor를 처음 사용하면 BeanPostProcessor가 실행될 때마다 BeanPostProcessor가 실행되고 Bean이 인스턴스화되고 모든 인스턴스가 인스턴스화 될 때까지 대기하지 않는다는 것을 알 수 있습니다.

스프링은 모든 것이 생성 된 후에 빈 세트로 후 처리를위한 메커니즘을 제공합니까?

답변

2

ApplicationContext에서 Bean을 작성하는 경우 ApplicationContext는 ApplicationEvents를 등록 된 ApplicationListener 콜백으로 시작합니다. 그 중 하나는 컨텍스트의 모든 빈이 Spring을 통해 함께 연결될 때 알려야합니다.

+0

Bryant에게 감사 드린다. 그것은 나를 바른 길로 인도한다. – Dave

0

여기 the documentation 순환 종속성에 대한 말씀입니다 :

는 주로 생성자 주입을 사용하는 경우, 에 확인할 수없는 순환 종속성 시나리오를 만들 수 있습니다.

예 : 클래스 A는 생성자 삽입을 통해 클래스 B의 인스턴스를 필요로하고 클래스 B는 생성자 삽입을 통해 클래스 의 인스턴스를 요구합니다. 클래스와 B 클래스를 서로 주입하기 위해 Bean을 구성하면 Spring IoC 컨테이너는 런타임에 순환 참조를 감지하고 BeanCurrentlyInCreationException을 발생시킵니다.

한 가지 가능한 솔루션은 생성자가 아닌 설정자가 구성한 이되도록 일부 클래스의 소스 코드를 편집하는 것입니다. 또는 생성자 주입을 피하고 setter 주입 만 사용하십시오. 즉, 권장하지는 않지만 설정자 삽입시 순환 종속성을 구성 할 수 있습니다.

(NO 순환 종속성) 일반적인 경우와 달리

, 빈들 중 하나가 다른 전에 완전히 자체 초기화되기 주입 될 빈 A 및 콩 B 힘 간의 순환 의존성 (a 고전 닭/계란 대본).

이 경우에는 setter injection을 사용하거나 처음에는 원형 의존성을 피하려고합니다. 또 다른 해결책은 bean BeanFactoryAware 중 하나를 만들고, 참조가 필요할 때 bean factory에서 다른 bean을 검색하는 것입니다.

+0

문서에서 같은 절을 찾았지만 제대로 작동하지 않으려면 http://stackoverflow.com/questions/15427664/wiring-mvp-with-spring-ioc-without-circular-reference/15428069를 참조하십시오. ? noredirect = 1 # 15428069. –