@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface Logged {
}
Java Platform, Enterprise Edition (Java EE) 8 Учебник по Java EE |
Назад | Вперёд | Содержание |
Interceptor — это класс, используемый для вставки в вызовы методов или события жизненного цикла, которые происходят в связанном целевом классе. Interceptor выполняет такие задачи, как ведение журнала или аудит, которые отделены от бизнес-логики приложения и часто повторяются в приложении. Такие задачи часто называют сквозными задачами. Interceptor-ы позволяют указывать код этих задач в одном месте для удобства сопровождения. Когда Interceptor-ы были впервые представлены в Java EE, они были характерны для Enterprise-бинов. В платформе Java EE их можно использовать с управляемыми объектами Java EE всех видов, включая Managed-бины.
Для получения информации об Interceptor-ах Java EE см. главу 57 «Использование Interceptor-ов Java EE».
Класс Interceptor-а часто содержит аннотированный метод @AroundInvoke
, который определяет задачи, которые Interceptor будет выполнять при вызове перехваченных методов. Он также может содержать метод, аннотированный @PostConstruct
, @PreDestroy
, @PrePassivate
или @PostActivate
, чтобы указать Callback-метод жизненного цикла Interceptor-а и метод, аннотированный @AroundTimeout
, для указания Interceptor-ов тайм-аута EJB. Класс Interceptor-а может содержать более одного метода Interceptor-а, но он должен иметь не более одного метода каждого типа.
Наряду с Interceptor-ом приложение определяет один или несколько типов привязки Interceptor-а, которые представляют собой аннотации, которые связывают Interceptor с целевыми компонентами или методами. Например, пример billpayment
содержит Interceptor, аннотированный @Logged
, и Interceptor с именем LoggedInterceptor
. Объявление типа привязки Interceptor-а выглядит примерно как объявление квалификатора, но оно аннотируется с помощью javax.interceptor.InterceptorBinding
:
@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface Logged {
}
Привязка Interceptor-а также имеет аннотацию java.lang.annotation.Inherited
, чтобы указать, что аннотация может быть унаследована от родительских классов. Аннотация @Inherited
также применяется к пользовательским областям видимости (не обсуждаемым в этом руководстве), но не относится к квалификаторам.
Тип привязки Interceptor-а может объявлять другие привязки Interceptor-а.
Класс Interceptor-а аннотируется привязкой Interceptor-а, а также аннотацией @Interceptor
. Пример см. в разделе Класс Interceptor-а LoggedInterceptor.
Каждый метод @AroundInvoke
принимает аргумент javax.interceptor.InvocationContext
, возвращает java.lang.Object
и допускает исключение Exception
. Он может вызывать методы InvocationContext
. Метод @AroundInvoke
должен вызывать метод continue
, который вызывает метод целевого класса.
После того как Interceptor и тип привязки определены, вы можете аннотировать бины и отдельные методы с помощью типа привязки, чтобы указать, что Interceptor должен вызываться либо для всех методов компонента, либо для конкретных методов. Например, в примере billpayment
бин PaymentHandler
аннотируется @Logged
, что означает, что любой вызов его бизнес-методов вызовет метод @AroundInvoke
Interceptor-а:
@Logged
@SessionScoped
public class PaymentHandler implements Serializable {...}
Однако в компоненте PaymentBean
только методы pay
и reset
имеют аннотацию @Logged
, поэтому Interceptor вызывается только тогда, когда эти методы вызываются:
@Logged
public String pay() {...}
@Logged
public void reset() {...}
Чтобы Interceptor вызывался в приложении CDI, он, как альтернатива, должен быть указан в файле beans.xml
. Например, класс LoggedInterceptor
указан следующим образом:
<interceptors>
<class>javaeetutorial.billpayment.interceptors.LoggedInterceptor</class>
</interceptors>
Если приложение использует более одного Interceptor-а, они вызываются в порядке, указанном в файле beans.xml
.
Interceptor-ы, указанные в файле beans.xml
, применяются только к классам в одном и том же архиве. Используйте аннотацию @Priority
, чтобы глобально указать Interceptor-ы для приложения, состоящего из нескольких модулей, как в следующем примере:
@Logged
@Interceptor
@Priority(Interceptor.Priority.APPLICATION)
public class LoggedInterceptor implements Serializable { ... }
Interceptor-ы с более низкими значениями приоритета вызываются первыми. Не обязательно указывать Interceptor в файле beans.xml
, когда используется аннотация @Priority
.
Назад | Вперёд | Содержание |