首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有必要在拦截器上定义拦截器绑定?

是否有必要在拦截器上定义拦截器绑定?
EN

Stack Overflow用户
提问于 2018-09-01 17:41:28
回答 2查看 1.2K关注 0票数 2

在JEE8教程中,https://javaee.github.io/tutorial/cdi-adv-examples005.html#GKHPA有一个拦截器,它用自己的拦截器绑定进行注释。以下摘录自本教程:

拦截器类LoggedInterceptor、及其拦截器绑定都是在拦截器包中定义的。日志记录的拦截器绑定定义如下:

代码语言:javascript
复制
@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface Logged {
}

LoggedInterceptor类如下所示:

代码语言:javascript
复制
@Logged
@Interceptor
public class LoggedInterceptor implements Serializable {    
    //...more code       
}

我的问题是,有必要在拦截器类本身上使用@Logged注释吗?我运行的代码没有@Logged注释,即:

代码语言:javascript
复制
@Interceptor
public class LoggedInterceptor implements Serializable {
   //...

而且它的行为似乎完全一样。通过玩弄teh代码,在我看来,将@Logged注释添加到方法foo中就是将foo标记为需要被拦截的方法的方式。那么,将类LoggedInterceptor标记为@Logged有什么意义呢?

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

发布于 2018-09-03 10:50:26

有两种方法可以定义拦截器,而且重要的是不要将它们混在一起-- together.One使用@Interceptor和拦截器绑定,另一种(在EJB中更常用,历史上更早)与@Interceptors(Some.class)一起工作。在拦截器规范中对两者都作了详细的解释,但让我简要介绍一下。

带绑定的@InterceptorBinding**)** (**@Interceptor** + )

绑定是它正常工作所必需的,它将拦截器与被拦截的类/方法“绑定”在一起。此外,需要通过beans.xml@Priority注释启用这些拦截器。启用会影响拦截器的排序。

您需要有一个拦截器绑定:

代码语言:javascript
复制
@Inherited
@InterceptorBinding
@Retention(RUNTIME)
@Target({METHOD, TYPE})
public @interface SomeBinding {
}

然后,拦截器本身(或更多)使用绑定进行注释,以将其绑定到该绑定。

代码语言:javascript
复制
@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应用于要拦截的方法和/或类。

代码语言:javascript
复制
public class SomeClass {
  @SomeBinding
  public void doWhatYouDoBest() {
    // some logic
  }
}

没有绑定的(**@Interceptors**)

这些拦截器不需要绑定,要启用它们,只需在@Interceptors注释中列出拦截器类(Es),这些注释放在类/方法的顶部。将它们放入注释中的顺序决定了调用它们的顺序。

您也不需要将@Interceptor放在实际的拦截器类上。

以下是您通常如何应用这些拦截器:

代码语言:javascript
复制
@Interceptors({MyInterceptor1.class, MyInterceptor2.class})
public void myMethod() {
 // do intercepted stuff
}

拦截器可能是这样的:

代码语言:javascript
复制
public class MyInterceptor1 {
  @AroundInvoke
  public void someMethod(InvocationContext ctx) {
    ...
    ctx.proceed();
    ...
  }
}

知道CDI支持这两种方式,但我强烈建议坚持使用绑定的方法,因为它更最新、更通用,例如能够更好地处理层次结构和排序。

票数 4
EN

Stack Overflow用户

发布于 2018-09-03 08:10:34

不需要,但是必须在它拦截的类上声明拦截器,而不是使用注释,即

代码语言:javascript
复制
public class MyService {

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

}

这有什么缺点?

如果不将其添加为拦截器列表的一部分,则无法定义另一个拦截器。

要更改拦截器的实现,就需要了解所有旧的拦截器都是在哪里声明的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52130685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档