복붙노트

[SPRING] 봄에 상호 의존성 빈을 연결하는 방법?

SPRING

봄에 상호 의존성 빈을 연결하는 방법?

두 개의 bean을 선언하고 Spring 종속성 삽입을 사용하여 인스턴스를 만들고 싶습니다.

<bean id="sessionFactory" class="SessionFactoryImpl">
 <property name="entityInterceptor" ref="entityInterceptor"/>
</bean>

<bean id="entityInterceptor" class="EntityInterceptorImpl">
 <property name="sessionFactory" ref="sessionFactory"/>
</bean>

그러나 Spring은 "현재 생성중인 FactoryBean은 getObject에서 null을 반환했습니다"라는 예외를 throw합니다.

상호 의존적 인 bean wiring이 왜 작동하지 않는가? 지연된 속성 바인딩을 어디에서 지정해야합니까?

해결법

  1. ==============================

    1.불행히도 Spring에서 컨테이너 초기화가 작동하는 방식으로 빈은 완전히 초기화 된 후에 만 ​​다른 빈에 삽입 될 수있다. 귀하의 경우에는 bean이 서로에 의존하기 때문에 초기화되지 않도록하는 순환 종속성이 있습니다. 이 문제를 해결하기 위해 bean 중 하나에서 BeanFactoryAware를 구현하고 beanFactory.getBean ( "beanName")을 사용하여 다른 bean에 대한 참조를 얻을 수 있습니다.

    불행히도 Spring에서 컨테이너 초기화가 작동하는 방식으로 빈은 완전히 초기화 된 후에 만 ​​다른 빈에 삽입 될 수있다. 귀하의 경우에는 bean이 서로에 의존하기 때문에 초기화되지 않도록하는 순환 종속성이 있습니다. 이 문제를 해결하기 위해 bean 중 하나에서 BeanFactoryAware를 구현하고 beanFactory.getBean ( "beanName")을 사용하여 다른 bean에 대한 참조를 얻을 수 있습니다.

  2. ==============================

    2.neesh가 맞다. Spring은 이것을 상자 밖으로 가져 가지 않는다.

    neesh가 맞다. Spring은 이것을 상자 밖으로 가져 가지 않는다.

    상호 의존성 빈은 설계 문제를 암시합니다. 이렇게하는 "깔끔한"방법은 구현에 대해 제어 할 수있는 경우와 같이 그러한 이상한 종속성이없는 방식으로 서비스를 다시 디자인하는 것입니다.

  3. ==============================

    3.종속성을 설정하는 BeanPostProcessor를 구현할 수 있습니다.

    종속성을 설정하는 BeanPostProcessor를 구현할 수 있습니다.

    또는...

    Costin의 답글을 참조하십시오.

    http://forum.springframework.org/showthread.php?t=19569&highlight=circular+dependencies

    여기 안드레아스의 대답을 보라.

    http://forum.springframework.org/showthread.php?t=29572&highlight=circular+dependencies

  4. ==============================

    4.createBeanFactory () 메소드를 사용하고 오버라이드하고있는 ApplicactionContext를 확장 할 수있다.

    createBeanFactory () 메소드를 사용하고 오버라이드하고있는 ApplicactionContext를 확장 할 수있다.

     protected DefaultListableBeanFactory createBeanFactory(){
        DefaultListableBeanFactory beanFactory = super.createBeanFactory();
        // By default this is false;
        beanFactory.setAllowRawInjectionDespiteWrapping( true );
        return beanFactory;
     }
    

    이것은 작동하지만 순환 참조가 허용되므로주의해야합니다.

  5. from https://stackoverflow.com/questions/425049/how-to-wire-interdependent-beans-in-spring by cc-by-sa and MIT license