2014-11-17 3 views
0

У меня есть класс A, B и C. A имеют ссылку B и B имеют ссылку C. A < -B < -C. Предположим, что мы используем Spring для инъекции объекта во время выполнения. Когда мы назовем getBean («A»), то spring создаст объект для всех зависимых классов. Теперь мое требование - сказать весне, что он не должен создавать объект класса C при создании объекта A. C должен создаваться только при вызове B или при поступлении потока на B.Как избежать создания зависимого объекта весной DI?

+0

вот что вы ищете http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/context/annotation/Lazy.html? – user902383

+0

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

ответ

0

Вы хотите явно указать свои компоненты как ленивые инициализированные.

<!-- A bean definition with lazy init set on --> 
    <bean id="..." class="..." lazy-init="true"> 
     <!-- collaborators and configuration for this bean go here --> 
    </bean> 

Контейнер не будет инициализировать компонент, если это необходимо. Обратите внимание: если бит загружен, он также загрузит зависимые компоненты, независимо от значения lazy-init.

+0

В самом своем ответе мы не можем прекратить создание bean-компонента, который находится на последнем шаге. –

+0

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

+0

, если вы установили это также, вы не можете избежать. –

0

По умолчанию весенний контейнер инициализирует все весенние бобы, объявленные в вашем коде. Если вы не хотите этого поведения, то такие компоненты могут быть настроены для инициализации лениво. В вашем случае, если вы определяете bean C для ленивой инициализации, он будет инициализирован, когда вы инициализируете bean A (поскольку C зависит от A) вместо инициализации при запуске фабрики компонентов/контейнера/приложения. Я думаю, что для описанного вами поведения нет такой возможности для определения такой инициализации.