Изучаем Java EE 7 - [23]

Шрифт
Интервал

В то время как веб-уровень имеет четко определенные области видимости (приложение, сеанс, запрос), на уровне сервисов такого не было (см. также главу 7 о компонент-сеансах EJB с сохранением и без сохранения состояния). Ведь, когда компонент-сеансы или POJO используются в веб-приложениях, они не оповещаются о контекстах этих приложений. CDI соединил веб-уровень с уровнем сервисов с помощью содержательных областей видимости. Он определяет следующие встроенные области видимости и даже предлагает точки расширения, в которых вы можете создавать собственные области видимости.

• Область видимости приложения (@ApplicationScoped) — действует на протяжении всей работы приложения. Компонент создается только один раз на все время работы приложения и сбрасывается, когда оно закрывается. Эта область видимости полезна для утилитных или вспомогательных классов либо объектов, которые хранят данные, используемые совместно целым приложением. Однако необходимо проявить осторожность в вопросах конкурентного доступа, когда доступ к данным должен осуществляться по нескольким потокам.

• Область видимости сеанса (@SessionScoped) — действует на протяжении нескольких запросов HTTP или нескольких вызовов метода для одного пользовательского сеанса. Компонент создается на все время длительности HTTP-сеанса и сбрасывается, когда сеанс заканчивается. Эта область видимости предназначена для объектов, требуемых на протяжении сеанса, таких как пользовательские настройки или данные для входа в систему.

• Область видимости запроса (@RequestScoped) — соответствует единственному HTTP-запросу или вызову метода. Компонент создается на все время вызова метода и сбрасывается по его окончании. Он используется для классов обслуживания или связующих компонентов JSF, которые нужны только на протяжении HTTP-запроса.

• Область видимости диалога (@ConverationScoped) — действительна между множественными вызовами в рамках одной сессии, ее начальная и конечная точка определяются приложением. Диалоги используются среди множественных страниц как часть многоступенчатого рабочего потока.

• Зависимая псевдообласть видимости (@Dependent) — ее жизненный цикл совпадает с жизненным циклом клиента. Зависимый компонент создается каждый раз при внедрении, а ссылка удаляется одновременно с удалением целевой точки внедрения. Эта область видимости по умолчанию предназначена для CDI.

Как видите, все области видимости имеют аннотацию, которую вы можете использовать с вашими компонентами CDI (все эти аннотации содержатся в пакете javax.enterprise.context). Первые три области видимости хорошо известны. Например, если у вас есть компонент «Корзина», чья область видимости ограничена одним сеансом, компонент будет создан автоматически, когда начнется сессия (например, во время первой регистрации пользователя в системе), и автоматически будет разрушен по окончании сессии.

>@SessionScoped

>public class ShoppingCart implements Serializable {…}

Экземпляр компонента ShoppingCart связан с сеансом пользователя и используется совместно всеми запросами, выполняемыми в контексте этой сессии. Если вы не хотите, чтобы компонент находился в сеансе неопределенно долго, подумайте о том, чтобы задействовать другую область видимости с более коротким временем жизни, например область видимости запроса или диалога. Обратите внимание, что компоненты с областью видимости @SessionScoped или @ConversationScoped должны быть сериализуемыми, так как контейнер периодически пассивизирует их.

Если область видимости явно не обозначена, то компонент принадлежит зависимой псевдообласти видимости (@Dependent). Компоненты с такой областью видимости не могут совместно использоваться несколькими клиентами или через несколько точек внедрения. Их жизненный цикл связан с жизненным циклом компонента, от которого они зависят. Зависимый компонент инстанцируется, когда создается объект, к которому он относится, и разрушается, когда такой объект уничтожается. Следующий отрывок кода показывает зависимый ограниченный ISBN-генератор с квалификатором:

>@Dependent @ThirteenDigits

>public class IsbnGenerator implements NumberGenerator {…}

Поскольку это область видимости по умолчанию, вы можете опустить аннотацию @Dependent и написать следующее:

>@ThirteenDigits

>public class IsbnGenerator implements NumberGenerator {…}

Области видимости могут быть смешанными. Компонент с аннотацией @SessionScoped можно внедрить в @RequestScoped или @ApplicationScoped и наоборот.

Диалог. Область видимости диалога несколько отличается от областей видимости приложения, сеанса или запроса. Она хранит состояние, ассоциированное с пользователем, распространяется сразу на много запросов и программно отграничивается от остального кода на уровне приложения. Компонент с аннотацией @ConversationScoped может использоваться для длительных процессов, имеющих начало и конец, таких как навигация по мастеру или покупка товаров и подтверждение и оплата заказа.

Объекты, область видимости которых ограничена одним запросом (HTTP-запросом или вызовом метода), обычно существуют очень недолго, тогда как объекты с областью видимости в пределах сеанса существуют на протяжении всего пользовательского сеанса. Однако есть много случаев, которые не относятся к этим двум крайностям. Отдельные объекты уровня представлений могут использоваться более чем на одной странице, но не на протяжении целой сессии. Для этого в CDI есть специальная область видимости диалога (@ConversationScoped). В отличие от объектов в пределах сеанса, которые автоматически отключаются контейнером по истечении заданной задержки, объекты в пределах диалога имеют четко определенный жизненный цикл, который явно начинается и явно заканчивается, причем начало и окончание задаются программно с помощью API javax.enterprise.context.Conversation.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.