Когда Spring создает экземпляры объектов, которые вводятся - PullRequest
8 голосов
/ 18 января 2010

Spring делает DI и создает объекты, так что вашей программе не нужно беспокоиться о создании объектов.Но вопрос здесь в том, когда создается экземпляр внедренного объекта.Это когда основная программа использует экземпляр или когда создается экземпляр основной программы.

Ответы [ 3 ]

13 голосов
/ 18 января 2010

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

Есть две вещи, которые могут помешать инициализации компонента при запуске контекста:

  • Боб сконфигурировал боб с различной областью действия (например, prototype, request или session) с использованием атрибута scope="xyz"
  • Бин был помечен lazy-init="true", и в этом случае он будет создан только тогда, когда его явно просят, или если он требуется как зависимость какого-либо другого бина.
5 голосов
/ 18 января 2010

В комментарии ОП пишет:

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

Да, решение принимает программист (или системный интегратор).

На самом деле нет никаких правил «лучшей практики» для принятия решения. Подумайте об этом так:

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

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

Короче говоря, вам нужно понять ваше приложение.

2 голосов
/ 18 января 2010

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html#beans-factory-lazy-init

По умолчанию реализации ApplicationContext с готовностью создают и настраивают все одноэлементные компоненты как часть процесса инициализации. Как правило, это предварительное создание является желательным, потому что ошибки в конфигурации или окружающей среде обнаруживаются немедленно, в отличие от часов или даже дней спустя. Когда такое поведение нежелательно, вы можете предотвратить предварительное создание экземпляра одноэлементного компонента, пометив определение компонента как инициализированный ленивым. Инициализированный ленивый bean-компонент сообщает контейнеру IoC о создании экземпляра bean-компонента при первом запросе, а не при запуске.

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