Spring IoC контейнер: области применения бинов, прототип (prototype)

Область применения не-синглтон прототипа (prototype) развертывания компонента приводит к созданию нового экземпляра компонента каждый раз, когда делается запрос на этот конкретный компонент. Таким образом, компонент вводится в другой компонент, или вы запрашиваете его с помощью вызова метода getBean() для контейнера. Как правило, вы должны использовать область действия прототипа для всех bean-компонентов с состоянием и единственную (singleton) область для bean-компонентов без состояния.

В следующем примере бин определяется как прототип в XML:

<bean id="accountService" class="com.something.DefaultAccountService" scope="prototype"/>

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

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

Singleton компоненты с зависимостями Prototype компонентов

Когда вы используете одноэлементные (singleton) компоненты с зависимостями от прототипов (prototype), имейте в виду, что зависимости разрешаются во время создания экземпляра. Таким образом, если вы вводите зависимый bean-объект prototype в bean-объект синглтона, создается новый bean-объект-прототип и затем внедряется зависимость в синглтон-компонент. Экземпляр прототипа является единственным экземпляром, который когда-либо поставляется в бин с singleton областью действия.

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


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки