Как подключить взаимозависимый beans в Spring?
Я хочу объявить два beans и создать их с помощью 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, который в настоящее время находится в создании, возвращает null из getObject"
Почему межзависимая проводка bean не работает здесь? Должен ли я указывать привязку дефферентной собственности где-нибудь?
Ответы
Ответ 1
К сожалению, как инициализация контейнера работает в Spring, bean может быть введена только в другой bean после полной инициализации. В вашем случае у вас есть циклическая зависимость, которая предотвращает инициализацию bean, потому что они зависят друг от друга. Чтобы обойти это, вы можете реализовать BeanFactoryAware в одном из beans и получить ссылку на другой bean с помощью beanFactory.getBean( "beanName" ).
Ответ 2
neesh прав, Spring не делает этого из коробки.
Взаимозависимый beans намекает на проблему с дизайном. "Чистый" способ сделать это - переделать ваши службы таким образом, чтобы таких нечетных зависимостей не было, конечно, при условии, что у вас есть контроль над реализациями.
Ответ 3
Вы можете реализовать 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
вы можете расширить ApplicationicactionContext, которые используют и переопределяют метод createBeanFactory()
protected DefaultListableBeanFactory createBeanFactory(){
DefaultListableBeanFactory beanFactory = super.createBeanFactory();
// By default this is false;
beanFactory.setAllowRawInjectionDespiteWrapping( true );
return beanFactory;
}
Это работает, но будьте осторожны, потому что это позволяет круговые ссылки.