2010-01-18 5 views
8

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

ответ

12

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

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

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

Вы правы! Неадминистративный компонент не будет создан сразу. +1 – nanda

+0

Спасибо, скаффман, который разъясняет мои сомнения. Поэтому программист должен решить, должен ли bean быть лениво инициализирован или инициализирован заранее. Это может быть очень субъективно, но не могли бы вы сообщить мне о каких-либо передовых методах, применяемых в подобных ситуациях. –

+0

Это совершенно субъективно, да, но тогда и остальная часть программного обеспечения. Это ничем не отличается. Но ваша позиция по умолчанию должна быть не-ленивой и по умолчанию. Делайте только фасоль, если у вас есть веская причина. – skaffman

2

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

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

4

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

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

Да, это зависит от программиста (или системного интегратора).

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

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

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

Одним словом, вы должны понимать свое применение.

+0

+1 оцените совет: «Короче, вам нужно понять ваше заявление». – asgs

Смежные вопросы