@Interceptors 和@InterceptorBinding + @Logged 之间的区别?
Differences between @Interceptors and @InterceptorBinding + @Logged?
似乎有两种方法可以将拦截器绑定到目标 class/method:
- @Interceptors on target class/method
- 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
似乎有两种方法可以将拦截器绑定到目标 class/method:
- @Interceptors on target class/method
- 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