Необходимо ли определять привязку перехватчика на перехватчике? - PullRequest
0 голосов
/ 01 сентября 2018

В руководстве по JEE8 на https://javaee.github.io/tutorial/cdi-adv-examples005.html#GKHPA у него есть перехватчик, который помечен своей собственной привязкой перехватчика. Следующее взято из учебника:

Класс перехватчика, LoggedInterceptor, и его связывание с перехватчиком , Зарегистрированы, оба определены в пакете перехватчика. Зарегистрированный связывание перехватчика определяется следующим образом:

@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface Logged {
}

Класс LoggedInterceptor выглядит следующим образом:

@Logged
@Interceptor
public class LoggedInterceptor implements Serializable {    
    //...more code       
}

У меня вопрос: нужно ли использовать аннотацию @Logged для самого класса перехватчика? Я выполнил код без аннотации @Logged, т. Е.

@Interceptor
public class LoggedInterceptor implements Serializable {
   //...

и, похоже, ведет себя точно так же. Играя с кодом, мне кажется, что добавление аннотации @Logged к методу foo - это то, как вы помечаете foo как метод, который необходимо перехватить. Так какой смысл помечать класс LoggedInterceptor как @Logged?

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Существует два способа определения перехватчиков, и важно не смешивать их вместе. Один использует @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 поддерживает оба пути, но я очень рекомендую придерживаться подхода с привязками, так как он более современный и универсальный, например, может лучше обрабатывать иерархии и порядок.

0 голосов
/ 03 сентября 2018

Нет, нет, но тогда вы должны объявить перехватчик в классе, который он перехватывает, вместо того, чтобы использовать аннотацию, т. Е.

public class MyService {

    @Interceptors(LoggedInterceptor.class)
    public void myInterceptedMethod() {}

}

Какой недостаток у этого?

Вы не можете определить другой перехватчик, не добавив его как часть списка перехватчиков

и

Изменение реализации перехватчика требует, чтобы вы пошли и выяснили, где был объявлен весь старый перехватчик

...