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

4
EugeneP 12 Май 2010 в 17:29

2 ответа

Лучший ответ

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

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

9
skaffman 12 Май 2010 в 17:42
Нет. У меня есть ссылка с прототипа на синглтон. Итак, синглтон - это свойство прототипа. Однако оба инициализируются, этот синглтон должен быть, и я не вижу необходимости инициализировать прототип сразу. Тем не менее такое бывает.
 – 
EugeneP
12 Май 2010 в 17:45
2 идеи ... используйте плагин eclipse spring, чтобы получить карту зависимостей вашего bean-компонента, чтобы вы могли видеть, зависит ли он от другого синглтона, также поставьте точку останова в конструкторе вашего прототипа bean-компонента, чтобы вы могли посмотреть на что вызывает его создание.
 – 
Michael Wiles
12 Май 2010 в 17:50
2
@EugeneP: Вы делаете что-то , чтобы запустить инициализацию прототипа. Я говорю вам, Spring не автоматически инициализирует прототипы при запуске.
 – 
skaffman
12 Май 2010 в 17:58
Да наверное что-то срабатывает. Хорошо, а как насчет "сеанса" в веб-приложении? Разве при запуске тоже не инициализируется?
 – 
EugeneP
12 Май 2010 в 20:42
@EugeneP: Все бины, не являющиеся одиночными, инициализируются только тогда, когда на них впервые ссылаются . Запуск сеанса HTTP не приведет к немедленной инициализации bean-компонентов в области сеанса.
 – 
skaffman
12 Май 2010 в 21:31

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

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

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

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

Если вы получили свой прототип 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);.

4
Community 23 Май 2017 в 15:16