quarkus依赖注入之十二:禁用类级别拦截器

十念  金牌会员 | 2023-8-11 07:51:06 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 912|帖子 912|积分 2736

欢迎访问我的GitHub

这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览


  • 本篇是《quarkus依赖注入》系列的第十二篇,继续学习拦截器的另一个高级特性:禁用类级别拦截器
  • 本篇由以下内容构成

  • 编码验证类拦截器和方法拦截器的叠加效果
  • 用注解NoClassInterceptors使类拦截器失效


  • 总的来说,本篇内容非常简单,就是说清楚NoClassInterceptors注解用在哪里,怎么用,可以轻松愉快的阅读
类拦截器和方法拦截器的叠加效果


  • 接下来进行编码,看看作用在类上和方法上的两个拦截器的叠加效果,要新建的文件清单如下

  • TrackClass.java:定义类级别的拦截器
  • TrackClassInterceptor.java:拦截器TrackClass的功能实现
  • TrackMethod.java:方法级别的拦截器
  • TrackMethodInterceptor.java:拦截器TrackMethod的功能实现
  • ExcludeInterceptorDemo.java:普通的bean,用TrackClass修饰其类,用TrackMethod修饰其test1方法
  • ExcludeInterceptorTest.java:单元测试类,运行ExcludeInterceptorDemo的方法,观察拦截效果


  • 以下是每个文件的详细内容

  • 第一个拦截器TrackClass,用来修饰类,对类的每个方法都有拦截效果
  1. @InterceptorBinding
  2. @Target({ElementType.TYPE, ElementType.METHOD})
  3. @Retention(RetentionPolicy.RUNTIME)
  4. public @interface TrackClass {
  5. }
复制代码

  • TrackClass的拦截功能实现类TrackClassInterceptor
  1. @TrackClass
  2. @Interceptor
  3. public class TrackClassInterceptor {
  4.     @AroundInvoke
  5.     Object execute(InvocationContext context) throws Exception {
  6.         Log.info("from TrackClass");
  7.         return context.proceed();
  8.     }
  9. }
复制代码

  • 第二个拦截器TrackMethod,用来修饰方法,只对被修饰的方法有拦截效果
  1. @InterceptorBinding
  2. @Target({ElementType.TYPE, ElementType.METHOD})
  3. @Retention(RetentionPolicy.RUNTIME)
  4. public @interface TrackMethod {
  5. }
复制代码

  • TrackMethod的拦截功能实现类TrackMethodInterceptor
  1. @TrackMethod
  2. @Interceptor
  3. public class TrackMethodInterceptor {
  4.     @AroundInvoke
  5.     Object execute(InvocationContext context) throws Exception {
  6.         Log.info("from TrackMethod");
  7.         return context.proceed();
  8.     }
  9. }
复制代码

  • 为了演示拦截器的效果,创建一个bean,如下所示,TrackClass修饰在类上面,所以test0和test1方法都会被TrackClassInterceptor拦截,另外,test1方法还会被TrackMethodInterceptor,也就是说两个拦截器都会拦截test1方法
  1. @ApplicationScoped
  2. @TrackClass
  3. public class ExcludeInterceptorDemo {
  4.     public void test0() {
  5.         Log.info("from test0");
  6.     }
  7.     @TrackMethod
  8.     public void test1() {
  9.         Log.info("from test1");
  10.     }
  11. }
复制代码

  • 用单元测试类验证效果
  1. @QuarkusTest
  2. public class ExcludeInterceptorTest {
  3.    
  4.     @Inject
  5.     ExcludeInterceptorDemo excludeInterceptorDemo;
  6.     @Test
  7.     public void test() {
  8.         excludeInterceptorDemo.test0();
  9.         Log.info("*****************************");
  10.         excludeInterceptorDemo.test1();
  11.     }
  12. }
复制代码

  • 运行效果如下,可见test0被类拦截器拦截,而test1先后被类拦截器和方法拦截器拦截


  • 当然了,以上一切都是符合预期的,并没有什么问题
用注解NoClassInterceptors使类拦截器失效


  • 假设遇到了某些冲突(例如和数据库、IO相关等),导致TrackClassInterceptor和TrackMethodInterceptor两个拦截器不能同时对test1方法进行拦截,只能保留TrackMethodInterceptor
  • 此时,可以用注解NoClassInterceptors修饰test1方法,如下图红框所示,这样类拦截器TrackClassInterceptor就会失效,只剩下TrackMethodInterceptor可以正常工作


  • 再次执行单元测试,效果如下图,可见类拦截器TrackClassInterceptor不再拦截被NoClassInterceptors修饰的test1方法
NoClassInterceptors的影响范围


  • 回顾类拦截器TrackClassInterceptor,如下图红框,可见其拦截方法有注解AroundInvoke修饰


  • 而NoClassInterceptors的作用,就是针对有注解AroundInvoke修饰的方法,使他们失效
  • 除了AroundInvoke,NoClassInterceptors还针对AroundConstruct修饰的方法,使他们失效
  • 至此,拦截器的高级特性已经全部学习和实践完成,希望能给您提供一些参考,助您设计出更完善的拦截器
源码下载

名称链接备注项目主页https://github.com/zq2599/blog_demos该项目在GitHub上的主页git仓库地址(https)https://github.com/zq2599/blog_demos.git该项目源码的仓库地址,https协议git仓库地址(ssh)git@github.com:zq2599/blog_demos.git该项目源码的仓库地址,ssh协议

  • 这个git项目中有多个文件夹,本次实战的源码在quarkus-tutorials文件夹下,如下图红框

  • quarkus-tutorials是个父工程,里面有多个module,本篇实战的module是basic-di,如下图红框

欢迎关注博客园:程序员欣宸

学习路上,你不孤单,欣宸原创一路相伴...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

十念

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表