Я хочу объявить два 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, который в настоящее время создается, вернул null из getObject».
Почему здесь не работает взаимозависимая проводка bean-компонентов? Должен ли я где-нибудь указывать привязку отложенного свойства?




К сожалению, инициализация контейнера работает в Spring, компонент может быть введен в другой компонент только после его полной инициализации. В вашем случае у вас есть циклическая зависимость, которая предотвращает инициализацию любого bean-компонента, потому что они зависят друг от друга. Чтобы обойти это, вы можете реализовать BeanFactoryAware в одном из bean-компонентов и получить ссылку на другой bean-компонент с помощью beanFactory.getBean ("beanName").
Я второй Сатиш. Вы можете сделать это с BeanA и BeanB, так что в этом примере есть что-то особенное.
Еще лучше не кодировать "beanName" жестко, а вместо этого использовать тег Spring <idref>, чтобы фабрика вставила имя компонента в свойство String.
Нееш прав, Spring не делает этого из коробки.
Взаимозависимые компоненты намекают на проблему дизайна. «Чистый» способ сделать это - изменить дизайн ваших сервисов таким образом, чтобы не было таких странных зависимостей, конечно, при условии, что у вас есть контроль над реализациями.
Я не думаю, что здесь ставится под сомнение его замысел (мы ничего не знаем о проблеме и ее решении); Вопрос в том, как можно справиться с циклическими зависимостями между объектами, управляемыми контейнером Spring.
И ответ, IMHO, не в том, чтобы - если у вас нет выбора, потому что реализация не ваша, и в этом случае решения, представленные здесь, помогут. Эти две службы являются либо одной службой, либо существует третья служба более высокого уровня, ожидающая обнаружения.
Вы можете реализовать BeanPostProcessor, который устанавливает зависимость.
Или же...
См. Ответ Костина здесь:
http://forum.springframework.org/showthread.php?t=19569&highlight=circular+dependencies
См. Ответ Андреаса здесь:
http://forum.springframework.org/showthread.php?t=29572&highlight=circular+dependencies
вы можете расширить ApplicactionContext, который использует, и переопределить метод createBeanFactory ()
protected DefaultListableBeanFactory createBeanFactory(){
DefaultListableBeanFactory beanFactory = super.createBeanFactory();
// By default this is false;
beanFactory.setAllowRawInjectionDespiteWrapping( true );
return beanFactory;
}
Это работает, но будьте осторожны, потому что это допускает циклические ссылки.
У меня не было этой проблемы, когда я попробовал простые классы, такие как BeanS и Bean.