Область видимости бинов
Когда мы определяем bean в Spring Framework, у нас есть возможность объявить область видимости этого компонента.
Например, если мы хотим, чтобы 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>
Пример небольшой программы:
Архив с исходным кодом проекта можно скачать по ЭТОЙ ССЫЛКЕ.
Структура программы
Класс Message.java
Класс MessageRunner.java
Конфигурационный файл message-bean.xml
Результат работы программы
Prototype
Когда мы присваиваем свойству scope значение prototype, контейнер Spring IoC создает новый экземпляр бина на каждый полученный запрос.
Бин с областью видимости prototype можно создать следующим образом:
<bean id = "someBean" scope = "prototype">
<!--some code to configure bean-->
</bean>
Пример простого приложения:
Исходный код проекта можно скачать по ЭТОЙ ССЫЛКЕ.
Структура проекта
Класс Message.java
Класс MessageRunner.java
Конфигурационный файл message-bean.xml
Результат работы программы
Как мы могли увидеть, в случае применения singleton, мы получили два одинаковых сообщения, так как использовался один и тот же экземпляр бина. В то время, как при использовании prototype, мы получили во втором сообщении null так, как был создан абсолютно новый объект, которому мы ничего не присваивали.