Как Spring разрешает это: бин A зависит от бина B, а бин B - на бине A.
Как уже говорилось в других ответах, Spring просто заботится об этом, создавая bean-компоненты и вводя их по мере необходимости.
Одним из последствий является то, что внедрение bean-компонентов / установка свойств могут происходить в порядке, отличном от того, что, по-видимому, подразумевают ваши XML-файлы проводки. Поэтому вам нужно быть осторожным, чтобы ваши установщики свойств не выполняли инициализацию, основанную на уже вызванных других установщиках. Чтобы справиться с этим, нужно объявить bean-компоненты как реализующие интерфейс InitializingBean
. Для этого необходимо реализовать метод afterPropertiesSet ()
, и именно здесь вы выполняете критическую инициализацию. (Я также включаю код, чтобы проверить, действительно ли установлены важные свойства.)
Справочное руководство Spring объясняет, как разрешаются циклические зависимости. Сначала создаются экземпляры бобов, а затем вводятся друг в друга.
Рассмотрим этот класс:
package mypackage;
public class A {
public A() {
System.out.println("Creating instance of A");
}
private B b;
public void setB(B b) {
System.out.println("Setting property b of A instance");
this.b = b;
}
}
И аналогичный класс B
:
package mypackage;
public class B {
public B() {
System.out.println("Creating instance of B");
}
private A a;
public void setA(A a) {
System.out.println("Setting property a of B instance");
this.a = a;
}
}
Если бы у вас был этот файл конфигурации:
<bean id="a" class="mypackage.A">
<property name="b" ref="b" />
</bean>
<bean id="b" class="mypackage.B">
<property name="a" ref="a" />
</bean>
Вы бы увидели следующий результат при создании контекста с использованием этой конфигурации:
Creating instance of A
Creating instance of B
Setting property a of B instance
Setting property b of A instance
Обратите внимание, что когда a
вводится в b
, a
еще не полностью инициализирован.
Он просто делает это. Он инстанцирует a
и b
, и вводит каждый из них в другой (используя их методы setter).
В чем проблема?
Из Spring Reference:
Как правило, вы можете доверять Spring в том, что он делает правильные вещи. Он обнаруживает проблемы конфигурации, такие как ссылки на несуществующие бобы и циклические зависимости, во время во время загрузки контейнера. Spring устанавливает свойства и разрешает зависимости как можно позже как можно позже, когда боб фактически создан.