Подтвердить что ты не робот

Spring Bean Области

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

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

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

Ответ 1

В spring спецификациях существует пять типов поддерживаемых областей bean:

1. синглтон (по умолчанию *)

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

2. Прототип

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

3. запрос

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

4. Сессия

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

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

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

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

Ответ 2

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

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

  • Синглтон:. Он возвращает один экземпляр bean для каждого контейнера IoC. Spring. Этот единственный экземпляр хранится в кеше такого одиночного beans, и все последующие запросы и ссылки для имени с именем bean возвращают кешированный объект. Если в bean не указывается область bean, по умолчанию в singleton.

  • Прототип. Он возвращает новый экземпляр bean каждый раз по запросу. Он не хранит кеш-версию, такую ​​как singleton.

  • Запрос. Он возвращает один экземпляр bean для каждого HTTP-запроса.

  • Сеанс: он возвращает один экземпляр bean для каждого сеанса HTTP (сеанс пользовательского уровня).

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

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

Ответ 3

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

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

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

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

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

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

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

Ответ 4

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

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

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

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

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

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

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

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

Ответ 5

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

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

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

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

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

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

Ответ 6

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

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

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

Ответ 7

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

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

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

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

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

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

Ответ 8

Вы можете прочитать этот блог, чтобы иметь представление о возможностях Spring bean. Это 2 минуты чтения.