2009-01-08 3 views
19

Я хочу объявить две бобы и создать их экземпляр, используя инъекцию пружинной зависимости?Как подключить взаимозависимые бобы весной?

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

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

Но весна бросает исключение, говоря «FactoryBean который в настоящее время в создании возвращается нуль из GetObject»

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

ответ

13

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

+0

У меня нет этой проблемы, когда я пробовал с помощью простых классов, таких как BeanA и BeanB. – Sathish

+0

Я второй Сатиш. Вы можете сделать это с помощью «BeanA» и «BeanB», поэтому в этом примере это нечто более особенное. –

+1

Еще лучше, не перекодируйте '' beanName "', но вместо этого используйте тег Spring '', чтобы фабрика ввела имя компонента в свойство 'String'. – Darien

3

neesh is right, Spring не делает это из коробки.

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

+0

+1 для редизайна - вам не нужна такая взаимозависимость. –

+1

Я не думаю, что его дизайн находится под вопросом здесь (мы ничего не знаем о проблеме и решении); Вопрос здесь в том, как можно решать круглые зависимости между объектами, управляемыми контейнером Spring. – neesh

+0

И ответ, ИМХО, не должен - если у вас нет выбора, потому что реализация не принадлежит вам, и в этом случае предоставленные здесь решения будут делать трюк. Эти две службы являются либо одной службой, либо есть третий, более высокий уровень обслуживания, ожидающий обнаружения. – Henning

0

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^