2016-10-06 5 views
1

Рассмотрим следующий код:
Вот класс Акруговая зависимость весной По сеттер инъекции

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

+0

Какой вопрос? Spring поддерживает круговую зависимость – Hurda

+0

да, но это не рекомендуется использовать. Причина, которую они дают, показана выше. Мой аргумент счетчика также показан выше. –

+1

Теперь попробуйте добавить метод '@ PostConstruct', в котором' A' использует 'B' и' B' использует 'A'. Один из них сломается.Поскольку либо A не полностью инициализирован перед использованием, либо B не полностью инициализируется при использовании. Если для любого вторжения у вас есть бесплатный сеттер без побочных эффектов, он также может сломаться. Наличие циклических зависимостей делает ваш код хрупким и может привести к странному поведению во время выполнения (особенно в стартовом/init-коде). Не говоря уже о том, что это может даже запутать компилятор. –

ответ

0

Весенние документы объясняют dependency resolution process.

В отличии от типичного случая (с не круговых зависимостей), круговой зависимостью между силами фасоли А и фасолью В одной из бобов, чтобы быть вводили в другой предварительного к тому полностью сам инициализирован (a классический сценарий курицы/яйца).

Бобы экземпляр первого, затем вводят друг в друга.

Поэтому Spring требует конструктор без аргументов ;-)

+0

Почему круговая зависимость не рекомендуется? Для этого приведен пример выше. Но как выше пример показывает нам недостаток круговой зависимости, даже если bean 'a' полностью инициализируется через некоторое время? –

+0

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

+0

Bean 'a' полностью инициализируется. Bean 'b' указывает на это. круговая зависимость не является препятствием в приведенном выше примере. Итак, почему выше пример сказал, чтобы показать недостаток круговой зависимости. –

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