Существует два способа определения перехватчиков, и важно не смешивать их вместе. Один использует @Interceptor
и привязки перехватчиков, другой (более часто используемый в EJB-компонентах и более старых версиях) работает с @Interceptors(Some.class)
. Оба подробно объясняются в спецификации перехватчиков, но позвольте мне кратко представить их.
С привязками (@Interceptor
+ @InterceptorBinding
)
Для правильной работы привязки требуется , это то, что «связывает» перехватчик вместе с классом / методом для перехвата. Кроме того, эти перехватчики должны быть включены через аннотацию beans.xml
или @Priority
. Включение влияет на порядок перехватчиков.
Вам необходимо привязать перехватчик:
@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface SomeBinding {
}
Затем сам перехватчик (или более), который вы аннотируете привязкой, чтобы связать его с этой привязкой.
@SomeBinding
@Interceptor
@Priority(1) // I used this annotation to enable the interceptor instead of beans.xml
public class MyInterceptor {
@AroundInvoke
public void someMethod(InvocationContext ctx) {
...
ctx.proceed();
...
}
}
И, наконец, теперь вы можете применять @SomeBinding
к методу и / или классам, которые вы хотите перехватить.
public class SomeClass {
@SomeBinding
public void doWhatYouDoBest() {
// some logic
}
}
Без привязок (@Interceptors
)
Эти перехватчики не требуют привязок , и для их включения вы просто перечисляете класс (ы) перехватчика внутри аннотации @Interceptors
, которую вы помещаете поверх вашего класса / метода. Порядок, в котором вы помещаете их в аннотацию, определяет порядок, в котором они будут вызываться.
Вам также не нужно ставить @ Interceptor на фактический класс перехватчика.
Вот как вы обычно применяете эти перехватчики:
@Interceptors({MyInterceptor1.class, MyInterceptor2.class})
public void myMethod() {
// do intercepted stuff
}
И перехватчик может выглядеть так:
public class MyInterceptor1 {
@AroundInvoke
public void someMethod(InvocationContext ctx) {
...
ctx.proceed();
...
}
}
Знайте, что CDI поддерживает оба пути, но я очень рекомендую придерживаться подхода с привязками, так как он более современный и универсальный, например, может лучше обрабатывать иерархии и порядок.