Java Platform, Enterprise Edition (Java EE) 8
Учебник по Java EE

Назад Вперёд Содержание

Использование областей видимости

Чтобы веб-приложение использовало компонент, который инъецирует другой компонент, компонент должен иметь возможность сохранять состояние в течение всего времени взаимодействия пользователя с приложением. Способ определить это состояние состоит в том, чтобы назначить бину область видимости. Объекту можно назначить любую из областей видимости, описанных в табл. 25-1, в зависимости от того, как он используется.

Таблица 25-1 Области видимости

Область видимости

Аннотация

Продолжительность

Запрос

@RequestScoped

Взаимодействие пользователя с веб-приложением в одном HTTP-запросе.

Сессия

@SessionScoped

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

Приложение

@ApplicationScoped

Общедоступные данные для всех пользователей с веб-приложением.

Зависимый

@Dependent

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

Диалог

@ConversationScoped

Взаимодействие пользователя с сервлетом, включая приложения 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;
    ...
}

Бины, использующие область видимости сессии, приложения или диалога, должны быть сериализуемыми. К бинам области видимости запроса такого требования нет.


Назад Вперёд Содержание
Логотип Oracle  Copyright © 2017, Oracle и/или её дочерних компаний. Все права защищены. Версия перевода 1.0.5 (Java EE Tutorial — русскоязычная версия)