乐趣区

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

欢送拜访我的 GitHub

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

本篇概览

  • 本篇是《quarkus 依赖注入》系列的第十二篇,持续学习拦截器的另一个高级个性:禁用类级别拦截器
  • 本篇由以下内容形成
  1. 编码验证类拦截器和办法拦截器的叠加成果
  2. 用注解 <font color=”blue”>NoClassInterceptors</font> 使类拦截器生效
  • 总的来说,本篇内容非常简单,就是说分明 NoClassInterceptors 注解用在哪里,怎么用,能够轻松愉快的浏览

类拦截器和办法拦截器的叠加成果

  • 接下来进行编码,看看作用在类上和办法上的两个拦截器的叠加成果,要新建的文件清单如下
  1. TrackClass.java:定义类级别的拦截器
  2. TrackClassInterceptor.java:拦截器 TrackClass 的性能实现
  3. TrackMethod.java:办法级别的拦截器
  4. TrackMethodInterceptor.java:拦截器 TrackMethod 的性能实现
  5. ExcludeInterceptorDemo.java:一般的 bean,用 TrackClass 润饰其类,用 TrackMethod 润饰其 test1 办法
  6. ExcludeInterceptorTest.java:单元测试类,运行 ExcludeInterceptorDemo 的办法,察看拦挡成果
  • 以下是每个文件的具体内容
  1. 第一个拦截器 <font color=”blue”>TrackClass</font>,用来润饰类,对类的每个办法都有拦挡成果
@InterceptorBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TrackClass {}
  1. TrackClass 的拦挡性能实现类 TrackClassInterceptor
@TrackClass
@Interceptor
public class TrackClassInterceptor {

    @AroundInvoke
    Object execute(InvocationContext context) throws Exception {Log.info("from TrackClass");
        return context.proceed();}
}
  1. 第二个拦截器 <font color=”blue”>TrackMethod</font>,用来润饰办法,只对被润饰的办法有拦挡成果
@InterceptorBinding
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface TrackMethod {}
  1. TrackMethod 的拦挡性能实现类 TrackMethodInterceptor
@TrackMethod
@Interceptor
public class TrackMethodInterceptor {

    @AroundInvoke
    Object execute(InvocationContext context) throws Exception {Log.info("from TrackMethod");
        return context.proceed();}
}
  1. 为了演示拦截器的成果,创立一个 bean,如下所示,TrackClass 润饰在类下面,所以 test0 和 test1 办法都会被 TrackClassInterceptor 拦挡,另外,test1 办法还会被 TrackMethodInterceptor,也就是说两个拦截器都会拦挡 test1 办法
@ApplicationScoped
@TrackClass
public class ExcludeInterceptorDemo {public void test0() {Log.info("from test0");
    }

    @TrackMethod
    public void test1() {Log.info("from test1");
    }
}
  1. 用单元测试类验证成果
@QuarkusTest
public class ExcludeInterceptorTest {
   
    @Inject
    ExcludeInterceptorDemo excludeInterceptorDemo;

    @Test
    public void test() {excludeInterceptorDemo.test0();
        Log.info("*****************************");
        excludeInterceptorDemo.test1();}
}
  • 运行成果如下,可见 test0 被类拦截器拦挡,而 test1 先后被类拦截器和办法拦截器拦挡
  • 当然了,以上一切都是合乎预期的,并没有什么问题

用注解 <font color=”blue”>NoClassInterceptors</font> 使类拦截器生效

  • 假如遇到了某些抵触(例如和数据库、IO 相干等),导致 TrackClassInterceptor 和 TrackMethodInterceptor 两个拦截器不能同时对 test1 办法进行拦挡,只能保留 TrackMethodInterceptor
  • 此时,能够用注解 <font color=”blue”>NoClassInterceptors</font> 润饰 test1 办法,如下图红框所示,这样类拦截器 TrackClassInterceptor 就会生效,只剩下 TrackMethodInterceptor 能够失常工作

<img src=”https://typora-pictures-1253575040.cos.ap-guangzhou.myqcloud.com/image-20220502192040472.png” alt=”image-20220502192040472″ style=”zoom:50%;” />

  • 再次执行单元测试,成果如下图,可见类拦截器 TrackClassInterceptor 不再拦挡被 NoClassInterceptors 润饰的 test1 办法

<img src=”https://typora-pictures-1253575040.cos.ap-guangzhou.myqcloud.com/image-20220502192714034.png” alt=”image-20220502192714034″ style=”zoom:67%;” />

NoClassInterceptors 的影响范畴

  • 回顾类拦截器 TrackClassInterceptor,如下图红框,可见其拦挡办法有注解 <font color=”blue”>AroundInvoke</font> 润饰

<img src=”https://typora-pictures-1253575040.cos.ap-guangzhou.myqcloud.com/image-20220502193918403.png” alt=”image-20220502193918403″ style=”zoom:50%;” />

  • 而 NoClassInterceptors 的作用,就是针对有注解 <font color=”blue”>AroundInvoke</font> 润饰的办法,使他们生效
  • 除了 AroundInvoke,NoClassInterceptors 还针对 <font color=”blue”>AroundConstruct</font> 润饰的办法,使他们生效
  • 至此,拦截器的高级个性曾经全副学习和实际实现,心愿能给您提供一些参考,助您设计出更欠缺的拦截器

源码下载

  • 本篇实战的残缺源码可在 GitHub 下载到,地址和链接信息如下表所示 (https://github.com/zq2599/blog_demos)
名称 链接 备注
我的项目主页 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 我的项目中有多个文件夹,本次实战的源码在 <font color=”blue”>quarkus-tutorials</font> 文件夹下,如下图红框
    <img src=”https://typora-pictures-1253575040.cos.ap-guangzhou.myqcloud.com/image-20220312091203116-20220502192937218.png” alt=”image-20220312091203116″ style=”zoom: 80%;” />
  • <font color=”blue”>quarkus-tutorials</font> 是个父工程,外面有多个 module,本篇实战的 module 是 <font color=”red”>basic-di</font>,如下图红框
    <img src=”https://typora-pictures-1253575040.cos.ap-guangzhou.myqcloud.com/image-20220312091404031-20220502192937321.png” alt=”image-20220312091404031″ style=”zoom:80%;” />

欢送关注思否:程序员欣宸

学习路上,你不孤独,欣宸原创一路相伴 …

退出移动版