码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • quarkus依赖注入之十二:禁用类级别拦截器


    合集 - quarkus实战(24)
    1.quarkus实战之一:准备工作07-212.quarkus实战之二:应用的创建、构建、部署07-223.quarkus实战之三:开发模式(Development mode)07-234.quarkus实战之四:远程热部署07-245.quarkus实战之五:细说maven插件07-256.quarkus实战之六:配置07-267.quarkus实战之七:使用配置07-278.quarkus实战之八:profile07-289.quarkus依赖注入之一:创建bean07-3010.quarkus依赖注入之二:bean的作用域07-3111.quarkus依赖注入之三:用注解选择注入bean08-0112.quarkus依赖注入之四:选择注入bean的高级手段08-0213.quarkus依赖注入之五:拦截器(Interceptor)08-0314.quarkus依赖注入之六:发布和消费事件08-0415.quarkus依赖注入之七:生命周期回调08-0516.quarkus依赖注入之八:装饰器(Decorator)08-0717.quarkus依赖注入之九:bean读写锁08-0818.quarkus依赖注入之十:学习和改变bean懒加载规则08-0919.quarkus依赖注入之十一:拦截器高级特性上篇(属性设置和重复使用)08-10
    20.quarkus依赖注入之十二:禁用类级别拦截器08-11
    21.quarkus依赖注入之十三:其他重要知识点大串讲(终篇)08-1222.quarkus数据库篇之二:无需数据库也能运行增删改查(dev模式)08-1623.quarkus数据库篇之三:单应用同时操作多个数据库08-1724.quarkus数据库篇之四:本地缓存08-18
    收起

    欢迎访问我的GitHub

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

    本篇概览

    • 本篇是《quarkus依赖注入》系列的第十二篇,继续学习拦截器的另一个高级特性:禁用类级别拦截器
    • 本篇由以下内容构成
    1. 编码验证类拦截器和方法拦截器的叠加效果
    2. 用注解NoClassInterceptors使类拦截器失效
    • 总的来说,本篇内容非常简单,就是说清楚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. 第一个拦截器TrackClass,用来修饰类,对类的每个方法都有拦截效果
    @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. 第二个拦截器TrackMethod,用来修饰方法,只对被修饰的方法有拦截效果
    @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先后被类拦截器和方法拦截器拦截

    image-20220502180545876

    • 当然了,以上一切都是符合预期的,并没有什么问题

    用注解NoClassInterceptors使类拦截器失效

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

    NoClassInterceptors的影响范围

    • 回顾类拦截器TrackClassInterceptor,如下图红框,可见其拦截方法有注解AroundInvoke修饰
    image-20220502193918403
    • 而NoClassInterceptors的作用,就是针对有注解AroundInvoke修饰的方法,使他们失效
    • 除了AroundInvoke,NoClassInterceptors还针对AroundConstruct修饰的方法,使他们失效
    • 至此,拦截器的高级特性已经全部学习和实践完成,希望能给您提供一些参考,助您设计出更完善的拦截器

    源码下载

    • 本篇实战的完整源码可在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项目中有多个文件夹,本次实战的源码在quarkus-tutorials文件夹下,如下图红框
      image-20220312091203116
    • quarkus-tutorials是个父工程,里面有多个module,本篇实战的module是basic-di,如下图红框
      image-20220312091404031

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

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

  • 相关阅读:
    【办公自动化】在Excel中按条件筛选数据并存入新的表(文末送书)
    H5互动游戏推荐,适合和产品结合的小游戏
    MySQL主从搭建--保姆级教学
    Redis-cluster集群详细部署配置--有手就行
    小程序页面导航和页面事件
    2023 极术通讯-安谋科技发布“山海”S20F安全解决方案,持续加码智能汽车“芯”赛道
    【PostgreSQL】查询30天前的数据
    JAVA:实现Permutation排列算法(附完整源码)
    汽车产业互联网如何跟上“智能”和“市场”节奏
    设计模式--适配器模式
  • 原文地址:https://www.cnblogs.com/bolingcavalry/p/17608154.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号