Как связать взаимозависимые бобы весной? - PullRequest
19 голосов
/ 08 января 2009

Я хочу объявить два 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"

Почему не работает взаимосвязь между компонентами? Должен ли я указать привязку отложенного свойства в любом месте?

Ответы [ 4 ]

13 голосов
/ 08 января 2009

К сожалению, способ инициализации контейнера в Spring позволяет добавить компонент в другой компонент только после полной инициализации. В вашем случае у вас есть циклическая зависимость, которая предотвращает инициализацию любого компонента, поскольку он зависит друг от друга. Чтобы обойти это, вы можете реализовать BeanFactoryAware в одном из компонентов и получить ссылку на другой компонент, используя beanFactory.getBean ("beanName").

3 голосов
/ 08 января 2009

Ниш прав, Spring не делает этого из коробки.

Взаимозависимые бины намекают на проблему дизайна. «Чистый» способ сделать это - перестроить ваши сервисы таким образом, чтобы не было таких странных зависимостей, конечно, при условии, что вы контролируете реализации.

2 голосов
/ 08 января 2009

Вы можете реализовать BeanPostProcessor , который устанавливает зависимость.

Или ...

См. Ответ Костина здесь:

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

См. Ответ Андреаса здесь:

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

0 голосов
/ 08 января 2009

вы можете расширить ApplicactionContext, который использует и переопределить метод createBeanFactory ()

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

Это работает, но будьте осторожны, потому что это допускает циклические ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...