ChildLazy объявлен как @Lazy, значит он будет загружен по первому требованию (но не раньше).
ChildNormal как @Lazy не объявлен, значит он будет загружен при старте приложения.
Composite так же не @Lazy.
Запустим SpringStart, вывод будет такой:
created LazyChild created NormalChild Composite is ready Composite.printNormalChild NormalChild.print() Composite.printLazyChild LazyChild.print()
Видно, что LazyChild загрузился одновременно с NormalChild. Случилось это потому, что Composite, являясь бином-синглетоном, требует LazyChild в качестве своего свойства.
Задачу решает создание ScopedProxy для LazyChild: таким образом в соответствующее свойство Composite будет проставлена только обертка, а сам LazyChild создастся только в том случае, если кто-нибудь вызовет какой-нибудь метод на прокси.
Выглядеть это будет так:
Запустив, получаем:
created NormalChild Composite is ready Composite.printNormalChild NormalChild.print() Composite.printLazyChild created LazyChild LazyChild.print()
Из последних трех строчек видно, что задача решена.
Комментариев нет:
Отправить комментарий