Главная » Spring » Область действия компонента Spring

0

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

При объявлении <bean> компонента можно определить область его действия. Чтобы заставить фреймворк Spring создавать новый экземпляр при каждом обращении, в объявление компонента следу- ет добавить атрибут scope со значением prototype. Например, пред- ставьте, что билеты на выступления объявляются как компоненты Spring:

<bean  id="ticket"

class="com.springinaction.springidol.Ticket"   scope="prototype"   />

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

Для первого посетителя это не страшно, но всех остальных могли бы обвинить в подделке!

Помимо значения prototype, атрибуту scope можно присвоить ряд других значений, определяющих область действия компонента, ко- торые перечислены в табл. 2.2.

Таблица 2.2. Фреймворк Spring позволяет определять различные области действия компонентов без жесткого определения правил видимости в программном коде

Область действия

Описание

singleton

В каждом контейнере Spring может быть создан только один компонент (по умолчанию)

prototype

Позволяет создавать произвольное количество компонентов (по одному на каждое обращение)

request

Область действия компонента ограничивается

HTTP-запросом. Может применяться только в веб-прило- жениях Spring (например, использующих Spring MVC)

session

Область действия компонента ограничивается

HTTP-сеансом. Может применяться только в веб-прило- жениях Spring (например, использующих Spring MVC)

global-session

Область действия компонента ограничивается глобальным HTTP-сеансом. Может применяться только в портлетах

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

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

<bean> для одного и того же класса.

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии