Как связать взаимозависимые бобы весной?

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
18
0
14 167
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

У меня не было этой проблемы, когда я попробовал простые классы, такие как BeanS и Bean.

Sathish 08.01.2009 20:23

Я второй Сатиш. Вы можете сделать это с BeanA и BeanB, так что в этом примере есть что-то особенное.

Grzegorz Oledzki 26.01.2011 11:31

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

Darien 29.07.2011 21:53

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

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

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

neesh 08.01.2009 20:47

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

Henning 08.01.2009 23:18

Вы можете реализовать 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;
 }

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

Другие вопросы по теме