欢迎访问我的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先后被类拦截器和方法拦截器拦截

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

用注解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,如下图红框

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

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

quarkus依赖注入之十二:禁用类级别拦截器的更多相关文章

  1. (转)SpringMVC学习(十二)——SpringMVC中的拦截器

    http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...

  2. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第十二章:几何着色器(The Geometry Shader) 代码工 ...

  3. 精尽Spring MVC源码分析 - HandlerMapping 组件(二)之 HandlerInterceptor 拦截器

    该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...

  4. ASP.NET Core依赖注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来. 服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了 ...

  5. NET 5 依赖注入多个服务实现类

    依赖注入在 ASP.NET Core 中起中很重要的作用,也是一种高大上的编程思想,它的总体原则就是:俺要啥,你就给俺送啥过来. 服务类型的实例转由容器自动管理,无需我们在代码中显式处理. 因此,有了 ...

  6. Spring第一课:依赖注入DI(二)

    DI Dependency Injection ,依赖注入 is a :是一个,继承. has a:有一个,成员变量,依赖. class B { private A a;   //B类依赖A类 } 依 ...

  7. Python学习第十九课——类的装饰器

    类的装饰器 # def deco(func): # print('==========') # return func # # # @deco #test=deco(test) # # def tes ...

  8. [十四]SpringBoot 之 Spring拦截器(HandlerInterceptor)

    过滤器属于Servlet范畴的API,与spring 没什么关系. Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截 ...

  9. 第1节 flume:15、flume案例二,通过自定义拦截器实现数据的脱敏

    1.7.flume案例二 案例需求: 在数据采集之后,通过flume的拦截器,实现不需要的数据过滤掉,并将指定的第一个字段进行加密,加密之后再往hdfs上面保存 原始数据与处理之后的数据对比 图一  ...

  10. python 面向对象十二 元类

    一.类也是对象 只要使用关键字class,Python解释器在执行的时候就会创建一个对象.下面的代码段: class ObjectCreator(object): pass 将在内存中创建一个对象,名 ...

随机推荐

  1. 2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分累加和}的最大值是多少? 整个过程要求时间复杂度O(N)。

    2021-04-07:给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分,每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分 ...

  2. 2021-07-20:最小区间。你有 k 个 非递减排列 的整数列表。找到一个 最小 区间,使得 k 个列表中的每个列表至少有一个数包含在其中。我们定义如果 b-a < d-c 或者在 b-a ==

    2021-07-20:最小区间.你有 k 个 非递减排列 的整数列表.找到一个 最小 区间,使得 k 个列表中的每个列表至少有一个数包含在其中.我们定义如果 b-a < d-c 或者在 b-a ...

  3. 【GPT-4理论篇-1】GPT-4核心技术探秘

    前言 GPT-4已经发布有一段时间了,但是出于安全性等各种原因,OpenAI并没有公布GPT-4的技术细节和代码,而是仅仅给出了一个长达100页的技术报告[1]. 这个技术报告着重介绍了GPT-4的强 ...

  4. 500行代码代码手写docker-将rootfs设置为只读镜像

    (3)500行代码代码手写docker-将rootfs设置为只读镜像 本系列教程主要是为了弄清楚容器化的原理,纸上得来终觉浅,绝知此事要躬行,理论始终不及动手实践来的深刻,所以这个系列会用go语言实现 ...

  5. RabbitMQ系列-概念及安装

    1. 消息队列 消息队列是指利用队列这种数据结构进行消息发送.缓存.接收,使得进程间能相互通信,是点对点的通信 而消息代理是对消息队列的扩展,支持对消息的路由,是发布-订阅模式的通信,消息的发送者并不 ...

  6. [vuex] unknown action type:***

    vuex 分模块后使用mapActions调用action老是提示 [vuex] unknown action type:*** 异常 目录 index.js是这样的 import Vue from ...

  7. 免费获取最新WebStorm激活码,永久激活WebStorm

    在互联网上,目前还没有查询到一篇写得比较详细的WebStorm安装和激活教程.今天我将使用WebStorm最新2023年版本,从下载到安装以及创建项目带大家完整的走一遍. 分享的 WebStorm 2 ...

  8. 国际顶刊《PNAS》:爱发朋友圈的人,更容易长寿

    点上面关注我们,每日获取前沿新知 近几十年来,智能手机和网络的普及率越来越高,与此同时,"朋友圈"应运而生. 在这个朋友圈里,有人十分活跃,而也有些人是"国家级潜水运动员 ...

  9. 罕见的技术:MSIL的机器码简析

    前言 一般的只有最终的汇编代码才有机器码表示,然一个偶然的机会发现,MSIL(Microsoft intermediate language)作为一个中间语言表示,居然也有机器码,其实这也难怪,计算机 ...

  10. 如何在矩池云上安装和使用 Stata

    Stata是一款功能强大的统计分析软件,本文提供了如何在矩池云安装使用 Stata,以及如何在 Jupyter 中使用 Stata 的简要教程. 安装 Stata 时需要确保按照官方指南进行操作,St ...