Рассмотрим следующий код:
Вот класс Акруговая зависимость весной По сеттер инъекции
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
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' получает ссылку на 'a', но через несколько мгновений «a» будет полностью инициализирован. Поскольку «b» имеет ссылку на «a», тогда «b» будет указывать на полностью инициализированный «a» через несколько мгновений. Это объяснение обычно дается, чтобы показать недостаток круговой зависимости. Но в итоге у нас нормальная ситуация как с полностью инициализированными фазами «a», так и «b», указывающими друг на друга. Следовательно, как этот пример показывает нам недостаток использования круговой зависимости?
Я хотел бы процитировать пружинных документы:
В отличие от типичного случая (без круговых зависимостей), круговой зависимость между силами фасоли А и фасоли В одной из бобов, чтобы быть вводили в другой до того, как полностью инициализирован себя ( классическая курица/яйцо сценарий А)
Ссылка: Пример взят из Circular dependency in spring
Какой вопрос? Spring поддерживает круговую зависимость – Hurda
да, но это не рекомендуется использовать. Причина, которую они дают, показана выше. Мой аргумент счетчика также показан выше. –
Теперь попробуйте добавить метод '@ PostConstruct', в котором' A' использует 'B' и' B' использует 'A'. Один из них сломается.Поскольку либо A не полностью инициализирован перед использованием, либо B не полностью инициализируется при использовании. Если для любого вторжения у вас есть бесплатный сеттер без побочных эффектов, он также может сломаться. Наличие циклических зависимостей делает ваш код хрупким и может привести к странному поведению во время выполнения (особенно в стартовом/init-коде). Не говоря уже о том, что это может даже запутать компилятор. –