HotLog

суббота, 19 февраля 2011 г.

Spring: lazy-init.

Рассмотрим вот этот проект.

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()

Из последних трех строчек видно, что задача решена.

Комментариев нет:

Отправить комментарий