import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
@RequestScoped
public class Printer {
@Inject @Informal Greeting greeting;
...
}
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Чтобы веб-приложение использовало компонент, который инъецирует другой компонент, компонент должен иметь возможность сохранять состояние в течение всего времени взаимодействия пользователя с приложением. Способ определить это состояние состоит в том, чтобы назначить бину область видимости. Объекту можно назначить любую из областей видимости, описанных в табл. 25-1, в зависимости от того, как он используется.
Таблица 25-1 Области видимости
Область видимости |
Аннотация |
Продолжительность |
Запрос |
|
Взаимодействие пользователя с веб-приложением в одном HTTP-запросе. |
Сессия |
|
Взаимодействие пользователя с веб-приложением в течение нескольких HTTP-запросов. |
Приложение |
|
Общедоступные данные для всех пользователей с веб-приложением. |
Зависимый |
|
Область видимости по умолчанию, если не указана явно. Это означает, что объект существует для обслуживания ровно одного клиента (бина) и имеет тот же жизненный цикл, что и этот клиент (бин). |
Диалог |
|
Взаимодействие пользователя с сервлетом, включая приложения JavaServer Faces. Область видимости диалога существует в границах, контролируемых разработчиком, которые распространяются на несколько запросов для длительных диалогов. Все длительные диалоги ограничиваются определённой сессией сервлета HTTP и не могут выходить за пределы этой сессии. |
Первые три области видимости присутствуют в обеих спецификациях: как JSR 365, так и в JavaServer Faces. Последние две определены только в JSR 365.
Все предопределённые области видимости, кроме @Dependent
, являются контекстными областями. CDI помещает компоненты в соответствующий их области видимости контекст, жизненный цикл которого определяется спецификациями Java EE. Например, контекст сессии и её компоненты доступны только во время жизни HTTP-сессии. Ссылки на бины инъецируются с учётом контекста. Ссылки всегда применяются к компоненту, связанному с контекстом для потока, который создаёт ссылку. Контейнер CDI гарантирует, что объекты создаются и инъецируются в правильное время, определяемое областью, указанной для этих объектов.
Вы также можете определять и реализовывать кастомные области видимости, но это отдельная и сложная тема. Кастомные области видимости могут использоваться теми, кто реализует и расширяет спецификацию CDI.
Область видимости даёт объекту чётко определённый контекст жизненного цикла. Объект области видимости создаётся автоматически, когда он необходим, и автоматически уничтожается, когда заканчивается создавший его контекст. Более того, его состояние автоматически передаётся любым клиентам, которые выполняются в том же контексте.
Компоненты Java EE, такие как сервлеты и Enterprise-бины, и компоненты JavaBeans по определению не имеют чётко определённой области видимости. Эти компоненты являются одним из следующих:
Синглтоны, такие как Enterprise-бины-синглтоны, состояние которых является одинаковым для всех клиентов
Объекты без состояния, такие как сервлеты и сессионные компоненты без состояния, которые не содержат доступного клиенту состояния
Объекты, которые должны быть явно созданы и уничтожены их клиентом, такие как компоненты JavaBeans и сессионные компоненты с состоянием, состояние которых совместно используется явной передачей ссылок между клиентами
Однако, если вы создаёте компонент Java EE, являющийся Managed-бином, он становится объектом области видимости, существующим в чётко определённом контексте жизненного цикла.
В веб-приложении для бина Printer
будет использоваться простой механизм запросов и ответов, поэтому Managed-бин можно аннотировать следующим образом:
import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
@RequestScoped
public class Printer {
@Inject @Informal Greeting greeting;
...
}
Бины, использующие область видимости сессии, приложения или диалога, должны быть сериализуемыми. К бинам области видимости запроса такого требования нет.
Назад | Вперёд | Содержание |