@Interceptors 和@InterceptorBinding + @Logged 之间的区别?

Differences between @Interceptors and @InterceptorBinding + @Logged?

似乎有两种方法可以将拦截器绑定到目标 class/method:

  1. @Interceptors on target class/method
  2. Declare a interceptor binding type(aka, a custom annotation annotated with @InterceptorBinding itself, for example @Logged), and using it on target class/method

我在 CDI 环境中使用拦截器。我的问题是,如果我使用 @Interceptors 将拦截器绑定到我的目标方法,是否完全没有必要声明额外的 interceptor binding type

如果答案是,那为什么IntelliJ IDEA老是报错

@Interceptor must specify at least one interceptor binding

当我不在拦截器上注释 interceptor binding type 时?

如果答案是,我已经使用@Interceptors(arrayOfMyInceptor)直接将我的拦截器绑定到目标class/method,为什么声明一个额外的 interceptor binding type 并在我的拦截器上使用它?


我在网上搜索,但找不到任何关于这两种方法的区别,希望 SO 可以解决我的问题。

感谢您的耐心等待。

注释 @Interceptor 和其他像 @Logged 这样的服装注释应该在拦截器 class 上调用,例如

@Logged
@Interceptor
@Priority(Interceptor.Priority.APPLICATION)
public class LoggedInterceptor implements Serializable { ... }

必须在您要创建的注释上调用注释 @InterceptorBinding,以表明它有点像 "interceptor qualifier"。

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

然后您可以在(托管)bean 或其方法上调用拦截器绑定注释。

@Logged
public String pay() {...}

@Logged
public void reset() {...}

See the java tutorial for more help https://docs.oracle.com/javaee/7/tutorial/cdi-adv006.htm

编辑

因为我误解了你的问题,这是我的编辑: 注解 @Interceptors 就像拦截器的集合。 通过将几个拦截器 classes(例如 @Logged 中的 LoggedInterceptor)传递给所应用的 @Interceptors 注释的 value 变量,所有这些拦截器绑定都会被调用:

@Interceptors({LoggedInterceptor.class,
OtherInterceptor.class,.....})

因此您至少需要一个拦截器绑定 @Interceptors

所以你需要拦截器绑定 class 本身 但不是 目标 class 因为它已经在@Interceptors 注释。

See the API documentation https://docs.oracle.com/javaee/7/api/javax/interceptor/Interceptors.html