it-roy-ru.com

Области применения бобовых

Может кто-нибудь объяснить, что такое области применения в бобах Spring, я всегда использовал «прототип», но есть ли другие параметры, которые я могу поставить вместо этого?

Пример того, о чем я говорю

    <bean id="customerInfoController" class="com.action.customer.Controller" scope="prototype">
    <property name="accountDao" ref="accountDao"/>
    <property name="utilityDao" ref="utilityDao"/>
    <property name="account_usageDao" ref="account_usageDao"/>  
</bean>
45
gcalex5

Из спецификаций spring поддерживаются пять типов областей действия bean:

1. singleton (по умолчанию *)

Области применения одного определения компонента к одному экземпляру объекта для Spring Контейнер IoC.

2. прототип

Области применения одного определения бина для любого числа экземпляров объекта.

3. запрос

Области применения одного определения бина к жизненному циклу одного HTTP запрос; то есть каждый HTTP-запрос будет иметь свой собственный экземпляр bean-компонента, созданный на основе определения одного компонента . Действителен только в контексте веб-приложения Spring ApplicationContext.

4. сессия

Обрабатывает определение единственного компонента для жизненного цикла сеанса HTTP . Действителен только в контексте веб-приложения Spring ApplicationContext.

5. глобальная сессия

Области применения одного определения бина к жизненному циклу глобального HTTP Сессия. Обычно действует только при использовании в контексте портлета. Только допустимо в контексте веб-приложения Spring ApplicationContext.

* default означает, что в теге <bean /> явно не указана область видимости . Подробнее о них можно прочитать здесь: http://static.springsource.org/spring/docs/3.0.0.M3/reference/html/ch04s04 .html

73
Juned Ahsan

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

Поддерживаются 5 типов областей действия:

  1. Singleton: Он возвращает один экземпляр компонента на контейнер Spring IoC. Этот единственный экземпляр хранится в кеше таких одноэлементных компонентов, и все последующие запросы и ссылки для этого именованного компонента возвращают кешированный объект. указано в файле конфигурации бина, по умолчанию для синглтона.

  2. Prototype : каждый раз по запросу возвращается новый экземпляр компонента. Он не хранит какую-либо версию кэша, как синглтон. 

  3. Запрос : возвращает один экземпляр компонента на HTTP-запрос.

  4. Session : возвращает один экземпляр компонента на сеанс HTTP (сеанс на уровне пользователя).

  5. GlobalSession : возвращает один экземпляр компонента на глобальный HTTP-сеанс. Он действителен только в контексте веб-приложения Spring ApplicationContext (сеанс уровня приложения).

В большинстве случаев вы можете иметь дело только с основной областью Spring - singleton и prototype , а область по умолчанию - singleton .

18
Divyesh Kanzariya

Просто хочу обновить, что в Spring 5, как упоминалось в Spring docs , Spring поддерживает 6 областей, четыре из которых доступны, только если вы используете веб-интерфейс ApplicationContext.

singleton (по умолчанию) Обрабатывает определение одного компонента в одном экземпляре объекта для контейнера Spring IoC.

прототип Области применения одного определения бина для любого числа экземпляров объекта.

запрос Обрабатывает определение единственного bean-компонента для жизненного цикла одного HTTP-запроса; то есть каждый HTTP-запрос имеет свой собственный экземпляр компонента, созданного на основе определения одного компонента. Действителен только в контексте веб-приложения Spring ApplicationContext.

session Обрабатывает определение единственного компонента для жизненного цикла сеанса HTTP. Действителен только в контексте веб-приложения Spring ApplicationContext.

приложение Области применения одного определения бина к жизненному циклу ServletContext. Действителен только в контексте веб-приложения Spring ApplicationContext.

websocket Области применения одного определения бина к жизненному циклу WebSocket. Действителен только в контексте веб-приложения Spring ApplicationContext.

6
heyjr

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

singleton: (по умолчанию) Обрабатывает определение одного компонента для отдельного экземпляра объекта на контейнер Spring IoC.

prototype: Области применения одного компонента определяются любым числом экземпляров объекта.

request: Обрабатывает определение одного компонента в течение жизненного цикла одного HTTP-запроса; то есть каждый HTTP-запрос имеет свой собственный экземпляр компонента, созданного на основе определения одного компонента. Действителен только в контексте веб-приложения Spring ApplicationContext.

session: Обрабатывает определение одного бина в течение жизненного цикла сеанса HTTP. Действителен только в контексте веб-приложения Spring ApplicationContext.

global session: Обрабатывает определение отдельного компонента для жизненного цикла глобального HTTP-сеанса. Обычно действует только при использовании в контексте портлета. Действителен только в контексте веб-приложения Spring ApplicationContext.

Дополнительные пользовательские области также можно создавать и настраивать с помощью CustomScopeConfigurer. Примером может служить область flow, добавленная Spring Webflow.

Кстати, вы утверждаете, что вы всегда использовали prototype, что я нахожу странным. Стандартная область действия singleton, и в разрабатываемом приложении мне редко требуется область действия прототипа. Возможно, вам стоит взглянуть на это.

5
LaurentG

Подробное объяснение каждой области можно найти здесь в Области Spring bean . Ниже приводится краткое изложение

Singleton - (По умолчанию) Области применения одного определения компонента к одному экземпляру объекта для контейнера Spring IoC.

prototype - Обрабатывает одно определение компонента для любого количества экземпляров объекта.

request - Обрабатывает определение одного бина в течение жизненного цикла одного HTTP-запроса; то есть каждый HTTP-запрос имеет свой собственный экземпляр компонента, созданного на основе определения одного компонента. Действителен только в контексте веб-приложения Spring ApplicationContext.

session - Обрабатывает определение одного компонента для жизненного цикла сеанса HTTP. Действителен только в контексте веб-приложения Spring ApplicationContext.

global session - Обрабатывает определение отдельного компонента для жизненного цикла глобального HTTP-сеанса. Обычно действует только при использовании в контексте портлета. Действителен только в контексте веб-приложения Spring ApplicationContext.

5
Vikas V

О прототипе бобов:

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

ref: https://docs.spring.io/spring/docs/3.0.0.M3/reference/html/ch04s04.html#beans-factory-scopes-prototype

0
emon

Согласно документации of Spring-Cloud-Config есть одна дополнительная область рядом с существующей пятеркой. Это @RefreshScope.

Это краткое описание RefreshScope:

При изменении конфигурации Spring @Bean помечается как @RefreshScope получает специальное лечение. Эта функция предназначена для проблема bean-компонентов с состоянием, которым вводят только их конфигурацию когда они инициализируются. Например, если источник данных имеет открытый соединения, когда URL базы данных изменяется через среду, вы вероятно, хотят, чтобы владельцы этих соединений могли завершить что они делают. Затем в следующий раз что-то заимствует соединение из пула, оно получает одно с новым URL.

Иногда может даже потребоваться применить @RefreshScope аннотация на некоторых bean-компонентах, которые могут быть инициализированы только один раз. Если боб является "неизменяемым", вам придется либо пометить компонент с помощью @RefreshScope или укажите имя класса под ключом свойства spring.cloud.refresh.extra-обновляемый.

Обновленные области видимости - это ленивые прокси, которые инициализируются, когда они используется (то есть, когда вызывается метод), а область действия действует как кеш инициализированных значений. Заставить бин повторно инициализироваться на следующем вызов метода, вы должны сделать недействительной запись в кеше.

RefreshScope является компонентом в контексте и имеет открытый Метод refreshAll () для обновления всех бинов в области путем очистки целевой кеш. Конечная точка/refresh предоставляет эту функциональность (более HTTP или JMX). Чтобы обновить отдельный бин по имени, есть также обновить (String) метод.

0
zappee