Круговая зависимость в Spring

Как Spring разрешает это: бин A зависит от бина B, а бин B - на бине A.

93
задан Richard Fearn 5 September 2018 в 09:37
поделиться

4 ответа

Как уже говорилось в других ответах, Spring просто заботится об этом, создавая bean-компоненты и вводя их по мере необходимости.

Одним из последствий является то, что внедрение bean-компонентов / установка свойств могут происходить в порядке, отличном от того, что, по-видимому, подразумевают ваши XML-файлы проводки. Поэтому вам нужно быть осторожным, чтобы ваши установщики свойств не выполняли инициализацию, основанную на уже вызванных других установщиках. Чтобы справиться с этим, нужно объявить bean-компоненты как реализующие интерфейс InitializingBean . Для этого необходимо реализовать метод afterPropertiesSet () , и именно здесь вы выполняете критическую инициализацию. (Я также включаю код, чтобы проверить, действительно ли установлены важные свойства.)

41
ответ дан 24 November 2019 в 06:17
поделиться

Справочное руководство 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 еще не полностью инициализирован.

71
ответ дан 24 November 2019 в 06:17
поделиться

Он просто делает это. Он инстанцирует a и b, и вводит каждый из них в другой (используя их методы setter).

В чем проблема?

12
ответ дан 24 November 2019 в 06:17
поделиться

Из Spring Reference:

Как правило, вы можете доверять Spring в том, что он делает правильные вещи. Он обнаруживает проблемы конфигурации, такие как ссылки на несуществующие бобы и циклические зависимости, во время во время загрузки контейнера. Spring устанавливает свойства и разрешает зависимости как можно позже как можно позже, когда боб фактически создан.

6
ответ дан 24 November 2019 в 06:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: