在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 {
//...而且它的行为似乎完全一样。通过玩弄teh代码,在我看来,将@Logged注释添加到方法foo中就是将foo标记为需要被拦截的方法的方式。那么,将类LoggedInterceptor标记为@Logged有什么意义呢?
谢谢你的帮助。
发布于 2018-09-03 10:50:26
有两种方法可以定义拦截器,而且重要的是不要将它们混在一起-- together.One使用@Interceptor和拦截器绑定,另一种(在EJB中更常用,历史上更早)与@Interceptors(Some.class)一起工作。在拦截器规范中对两者都作了详细的解释,但让我简要介绍一下。
带绑定的@InterceptorBinding**)** (**@Interceptor** + )
绑定是它正常工作所必需的,它将拦截器与被拦截的类/方法“绑定”在一起。此外,需要通过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注释中列出拦截器类(Es),这些注释放在类/方法的顶部。将它们放入注释中的顺序决定了调用它们的顺序。
您也不需要将@Interceptor放在实际的拦截器类上。
以下是您通常如何应用这些拦截器:
@Interceptors({MyInterceptor1.class, MyInterceptor2.class})
public void myMethod() {
// do intercepted stuff
}拦截器可能是这样的:
public class MyInterceptor1 {
@AroundInvoke
public void someMethod(InvocationContext ctx) {
...
ctx.proceed();
...
}
}知道CDI支持这两种方式,但我强烈建议坚持使用绑定的方法,因为它更最新、更通用,例如能够更好地处理层次结构和排序。
发布于 2018-09-03 08:10:34
不需要,但是必须在它拦截的类上声明拦截器,而不是使用注释,即
public class MyService {
@Interceptors(LoggedInterceptor.class)
public void myInterceptedMethod() {}
}这有什么缺点?
如果不将其添加为拦截器列表的一部分,则无法定义另一个拦截器。
和
要更改拦截器的实现,就需要了解所有旧的拦截器都是在哪里声明的。
https://stackoverflow.com/questions/52130685
复制相似问题