Руководство по Spring. Область видимости бинов.

Прим. Отсутствие в русском языке достойного перевода этого свойства бинов могут вызвать затруднения, но после прочтения этой статьи оно должно испариться.

Когда мы определяем bean в Spring Framework, у нас есть возможность объявить область видимости этого компонента.

spring-by-pivotal

Например, если мы хотим, чтобы Spring возвращал нам один и тот же бин при каждом запросе, мы должны выбрать область видимости singleton.

В Spring Framework имеются пять возможных значений свойства scope:


singleton

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

prototype

Позволяет иметь любое количество экземпляров бина.

request

Создаётся один экземпляр бина на каждый HTTP запрос. Касается исключительно ApplicationContext.

session

Создаётся один экземпляр бина на каждую HTTP сессию. Касается исключительно ApplicationContext.

global-session

Создаётся один экземпляр бина на каждую глобальную HTTP сессию. Касается исключительно ApplicationContext.


На данный момент мы ещё не касались Spring ApplicationContext, поэтому сейчас обсудим только singleton и prototype.

Singleton

Если мы устанавливаем свойству scope значение singleton, то в это случае контейнер Spring IoC создаёт только один экземпляр объекта определённого в бине. Этот экземпляр помещается в кэш таких же бинов (синглетонов) и все последующие вызовы бина с таким именем будут возвращать объект из кэша.

По умолчанию область видимости устанавливается singleton, но если вы хотите акцентировать внимание на этом, то можно использовать такую запись:

<bean id = "someBean" scope = "singleton">
<!--some code to configure bean-->
</bean>

Пример небольшой программы:

Архив с исходным кодом проекта можно скачать по ЭТОЙ ССЫЛКЕ.

Структура программы

singleton_structure

Класс Message.java

singleton_message

Класс MessageRunner.java

singleton_messageRunner

Конфигурационный файл message-bean.xml

singleton_message_xml

Результат работы программы

singleton_result

Prototype

Когда мы присваиваем свойству scope значение prototype, контейнер Spring IoC создаёт новый экземпляр бина на каждый полученный запрос.

Бин с областью видимости prototype можно создать следующим образом:

<bean id = "someBean" scope = "prototype">
<!--some code to configure bean-->
</bean>

Пример простого приложения:

Исходный код проекта можно скачать по ЭТОЙ ССЫЛКЕ.

Структура проекта

singleton_structure

Класс Message.java

singleton_message

Класс MessageRunner.java

singleton_messageRunner

Конфигурационный файл message-bean.xml

prototype_message_bean_xml

Результат работы программы

prototype_result

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

В следующем уроке мы с Вами рассмотрим жизненный цикл бинов, а на сегодня всё. До связи.