Как позволить Spring инициализировать bean-объекты «prototype» только тогда, когда он получен через getBean ()? - PullRequest
4 голосов
/ 12 мая 2010

Я вижу, что при первоначальном запуске он инициализирует компоненты-прототипы. Как это предотвратить?

Ответы [ 2 ]

7 голосов
/ 12 мая 2010

Это не так, bean-объекты с прототипом не инициализируются при запуске, если на них не ссылается что-то еще.

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

3 голосов
/ 12 мая 2010

Как говорит Скаффман в своем посте , бины-прототипы не инициализируются при запуске.

Даже этот bean-компонент-прототип, для которого настроен параметр lazy-init со значением false, не создается до выполнения метода ApplicationContext.getBean(..).

<bean id="demo" class="demo.Demo" scope="prototype" lazy-init="false">

Это просто добавление сообщения журнала отладки в конструктор вашего компонента или запуск вашего отладчика, тогда вы увидите это сами.

Если вы получите ваш bean-прототип следующим образом:

Demo demo = context.getBean("demo", Demo.class);

Тогда нет абсолютно никаких шансов, что он инициализируется при запуске контейнера.

Если у вас все еще есть проблемы с активной инициализацией bean-компонента с областью действия прототипа, я предлагаю вам показать код, взаимодействующий с контейнером Spring и конфигурацией Spring.

Ситуация, когда прототипный компонент будет инициализирован при запуске контейнера (если ваш компонент не настроен на lazy-init="true"):

SingletonBean singletonBean = context.getBean(SingletonBean.class);
Demo demo = singletonBean.getDemo();

Когда одноэлементный компонент имеет зависимость от прототипа, компонент-прототип будет инициализирован вместе с одноэлементным компонентом.

Еще один побочный эффект при получении демонстрационного объекта через singletonBean состоит в том, что у вас будет только один демонстрационный объект, независимо от того, сколько раз вы выполняете метод context.getBean(SingletonBean.class);.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...