【Spring】AOP切点表达式

文章目录

  • 1、语法
  • 2、通配符
  • 3、execution
  • 4、within
  • 5、@annotation
  • 6、args
  • 7、@args
  • 8、bean
  • 9、this
  • 10、target
  • 11、@target
  • 12、@within
  • 13、表达式组合
  • 14、补充

在这里插入图片描述

1、语法

动作关键词(访问修饰符 返回值 包名.类/接口名 .方法名(参数)异常名)

举例:

execution(public User com.llg.service.Uservice.findById(int))
  • 动作关键字:描述切入点的行为动作,execution即执行到指定切入点
  • 方法修饰符:public、private等可以省略
  • 返回值
  • 包名
  • 类/接口名
  • 参数
  • 异常名:方法定义中抛出指定异常,可以省略

2、通配符

使用通配符来描述切入点,提高效率:

  • * 代表单个独立的任意符号,可以独立出现,也可做为前缀或后缀匹配符。
execution(public * com.llg.*.UserService.find* (*))

以上代表匹配com.llg包下得任意包中得UserService类或接口中所有find开头得带有一个参数(注意不是无参数)、返回类型任意的public方法

  • . .即多个连续的任意符号,可独立出现,常用于简化包名与参数的书写
execution(public User com..UserService.findById(..))

以上代表匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法 (形参个数无所谓)

  • + 用于专门用于匹配子类类型
execution(* *..*Service+.*(..))

3、execution

最常用,表达式中是一个方法。举例:

  • 匹配所有的不带参数的add()方法
execution(* add())
  • 匹配所有抛出Exception的方法
execution(* *(..) throws Exception)

写个简单的完整例子:

//通知类
@Component
@Aspect
public class CutAdvice {@Pointcut("execution(* *..MyService.myExecution(..))")public void pointCut(){}@Before("pointCut()")public void beforeSome(){System.out.println("前置AOP成功");}
}
//即将匹配到被增强的切点方法
@Service
public class MyService {public void myExecution(){System.out.println("execution ...");}
}

调用下这个切点方法,看到AOP增强成功:

在这里插入图片描述

4、within

根据一个类来匹配,这个类中的所有方法将被匹配为切点,并被拦截增强。

  • 匹配UserServiceImpl类对应对象的所有方法外部调用,而且这个对象只能是UserServiceImpl类型,不能是其子类型
within(com.llg.service.UserServiceImpl)
  • 匹配com.llg包及其子包下面所有的类的所有方法的外部调用
within(com.elim..*)

写个例子展示下效果:

//通知类
@Component
@Aspect
public class CutAdvice {@Pointcut("within(cn.llg.user.service.MyService)")public void pointCut(){}@Before("pointCut()")public void beforeSome(){System.out.println("MyService中的方法即将被调用,前置AOP成功");}
}
//即将匹配到的类
@Service
public class MyService {public void methodOne(){System.out.println("MyService类中的methodOne方法");}public void methodTwo(){System.out.println("MyService类中的methodTwo方法");}
}

调用MyService类中的两个方法,看到这两个方法均被增强:

在这里插入图片描述

5、@annotation

根据注解来匹配,用于匹配方法上拥有指定注解的情况

  • 匹配所有的方法上拥有MyAnnotation注解的方法
@annotation(com.llg.service.MyAnnotation)

按注解匹配切点,还可以通知类中获取注解的属性,贴个例子:

@Component
@Aspect
public class RedisAdvice {@Pointcut("@annotation(org.springframework.cache.annotation.Cacheable)")public void redisCut(){}//Cacheable redisInfo@Around("redisCut() &&@annotation(redisInfo)")public Object doAround(ProceedingJoinPoint proceedingJoinPoint,Cacheable redisInfo) throws Throwable {//获取属性StringBuilder redisKey = new StringBuilder(redisInfo.key()).append("::").append(redisInfo.value()[0]);MethodSignature signature = (MethodSignature) proceedingJoinPoint.getSignature();String methodName = signature.getName();// ....Object ret = proceedingJoinPoint.proceed();return ret;}}

获取切点表达式注解的属性,跳这篇【用AOP拦截注解并获取注解属性值】

6、args

按方法的参数匹配,即增强形参符合表达式的方法

  • 匹配并增强任何不带参数的方法
args()
  • 匹配并增强带任意个参数的方法(等于是全员增强了)
args(..)
  • 匹配并增强只有一个形参,且类型为String的方法
args(java.lang.String)
  • 匹配并增强形参有任意个,但第一个类型为String的方法
args(java.lang.String,..)
  • 匹配并增强形参有任意个,但最后一个参数为String类型的方法
args(..,java.lang.String)

7、@args

按参数的类型的类上的注解匹配,当某方法的形参类型的类上有指定的注解,则匹配成功。

@args(com.sun.MyAnnotation)

当有个方法method(MyParam param),它形参的类型为MyParam,MyParam类上有@MyAnnotation注解时匹配成功,增强method方法

8、bean

按bean去匹配,只要是这个bean在调用的方法,就做AOP增强

  • 匹配Spring Bean容器中id或name为myBean的bean,并增强它调用的所有方法
bean(myBean)
  • 匹配所有id或name为以user开头的bean,并增强它调用的所有方法
bean(user*)

9、this

Spring AOP基于代理实现,先看下整个流程:

在这里插入图片描述

即,Spring容器初始化Bena时,发现bean对应的类中有切点时,就不再创建原始对象了,而是创建这个类的对象的代理对象,切点表达式中的this就是指这个代理对象。

语法:this(type)

当生成的代理对象,可以转型为type这个类型时,匹配成功

this(com.service.IUserService)

匹配生成的代理对象是IUserService类型的所有方法的外部调用

10、target

和this相反,被代理的目标对象可以被转换为指定的类型时,匹配成功。

target(com.service.IUserService)

匹配被代理的目标对象能够转换为IUserService类型的所有方法的外部调用

11、@target

和args、@args类似,当被代理的目标对象对应的类型及其父类型上拥有指定的注解时,匹配成功

@target(com.sun.MyAnnotation)

被代理的目标对象对应的类型上拥有MyAnnotation注解时,匹配成功

12、@within

匹配被代理的目标对象对应的类型或其父类型拥有指定的注解的情况,但只有在调用拥有指定注解的类上的方法时才匹配。

@within(com.spring.service.MyAnnotation)

举个例子:

@MyAnnotation
class A {void method a();
}

B类集成A类,且有做为子类特有的方法B

class B {void method b();
}

此时,

new A().a()  匹配
new B().b()  不匹配
new B().a()	 匹配
子类B重写方法a后再调用:
new B().a()  不匹配

后面这几个没测过,应该用到的场景不多。

13、表达式组合

上面的一个个表达式,可以通过逻辑运算符或与非连接起来,以实现匹配到更复杂的增强需求。

  • 匹配id或name为userService的bean调用的方法,这个方法必须无参
bean(userService) && args()
  • 匹配id或name为userService的bean调用的方法,这个方法必须至少有一个形参
bean(userService) && !args()
  • 匹配id或name为userService的bean调用的方法,或者使用了@MyAnnotation这个注解的方法
bean(userService) || @annotation(MyAnnotation)

14、补充

开发中不一定要严格按下面的标准流程,先定义一个无意义无返回值的切点定义类,再写一个新方法来写增强的功能。

@Component
@Aspect
public class CutAdvice {//先定义一个无意义无返回值的切点定义类@Pointcut("execution(* *..MyService.myExecution(..))")public void pointCut(){}@Before("pointCut()")public void beforeSome(){System.out.println("前置AOP成功");}
}

直接将切点方法或者切点表达式写到五种通知类型的注解中也行:

//直接写切点
@Before("com.llg.service.Uservice.findById()")
public void beforeSome() {System.out.println("AOP前置");
}

也可直接跟切点表达式

/*** 所有的add方法执行时*/
@Before("execution(* add())")
public void beforeExecution() {System.out.println("AOP前置.....");
}


在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/26037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AIGC:【LLM(五)】——Faiss:高效的大规模相似度检索库

文章目录 一.简介1.1 什么是Faiss1.2 Faiss的安装 二.Faiss检索流程2.1 构建向量库2.2 构建索引2.3 top-k检索 三.Faiss构建索引的多种方式3.1 Flat :暴力检索3.2 IVFx Flat :倒排暴力检索3.3 IVFxPQy 倒排乘积量化3.4 LSH 局部敏感哈希3.5 HNSWx 一.简介…

flask------消息闪现 flash

1介绍 flask提供了一个非常有用的flash()函数,它可以用来“闪现”需要提示给用户的消息,比如当用户登录成功后显示“欢迎回来!”。在视图函数调用flash()函数,传入消息内容,flash()函数把消息存…

TPlink DDNS 内网穿透?外网访问设置方法

有很多小伙伴都想知道:TPlink路由器怎么设置DDNS内网穿透?今天,小编就给大家分享一下TPlink DDNS 外网访问设置方法,下面是图文教程,帮助新手快速入门DDNS设置。 本文介绍的是云路由器TP-LINK DDNS的设置方法。TP-LIN…

R-Meta分析教程

详情点击链接:R-Meta模型教程 一:Meta分析的选题与文献计量分析CiteSpace应用 1、Meta分析的选题与文献检索 1)什么是Meta分析? 2)Meta分析的选题策略 3)文献检索数据库 4)精确检索策略,如何检索全、检索准 5)文献的管理与…

浏览器同源策略

浏览器同源策略 同源策略:是一个重要的浏览器的安全策略,用于限制一个源的文档或者它加载的脚本如何能与另一个源的资源进行交互 它能帮助阻隔恶意文档,减少可能被攻击的媒介 例如:被钓鱼网站收集信息,使用ajax发起…

DevOps系列文章之 Docker 安装 NFS 服务器

Docker 安装 NFS 服务器 环境: 192.186.2.105 NFS 服务器 192.168.2.106 Client 客户端 安装 一、服务器端 https://github.com/f-u-z-z-l-e/docker-nfs-server 1、创建目录 mkdir /nfsdata mkdir -p /docker/nfs/2、启动脚本 vim start.sh# 内容 docker run …

shell脚本自动打包部署

1、安装git 2、使用Git克隆代码 3、安装Maven (1) tar -zxvf ** 解压文件 (2)修改配置 (3)source /etc/profile 重新加载一下文件 (4)mvn -version 查看版本号 已经安装成…

线程池的使用案例一

一、配置线程池 1、不推荐的方式 ExecutorService executorService Executors.newFixedThreadPool(); // 创建⼀个固定⼤⼩的线程池,可控制并发的线程数,超出的线程会在队列中等待; ExecutorService executorService Executors.newCache…

基于Java+SpringBoot+Vue的篮球竞赛预约平台设计与实现(源码+LW+部署文档等)

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

C# 简单模拟 程序内部 消息订阅发布功能

文章目录 前言模拟消息订阅发布使用注意事项 前言 我想做个简单的消息发布订阅功能,但是发现好像没有现成的工具类。要么就是Mqtt这种消息订阅发布。但是我只想程序内部进行消息订阅发布,进行程序的解耦。那没办法了,只能自己上了 模拟消息…

【JavaSE】String类中常用的字符串方法(超全)

目录 1.求字符串的长度 2.判断字符串是否为空 3.String对象的比较 3.1 判断字符串是否相同 3.2 比较字符串大小 3.3 忽略大小写比较 4.字符串查找 5.转化 5.1 数值和字符串转化 5.1.1 数字转字符串 valueof 5.1.2 valueOf的其他用法 5.1.3 字符串转数字 5.2 大小写转…

【Shell】基础语法(二)

文章目录 一、Shell基本语法文件名代换命令代换算术代换转义字符引号 二、Shell脚本语法条件测试分支结构循环 三、总结 一、Shell基本语法 文件名代换 用于匹配的字符称为通配符(Wildcard),如:* ? [ ] 具体如下: *…

3个月拿下华为测试岗,早知道华为这么好进,我就...

先说一下我的情况,某211本科计算机专业,之前在深圳那边做了大约半年多少儿编程老师,之后内部平调回长沙这边,回来之后发现有点难,这边可能是业绩难做,虚假承诺很厉害,要给那些家长虚假承诺去骗人…

暗黑版GPT流窜暗网 降低犯罪门槛

随着AIGC应用的普及,不法分子利用AI技术犯罪的手段越来越高明,欺骗、敲诈、勒索也开始与人工智能沾边。 近期,专为网络犯罪设计的“暗黑版GPT”持续浮出水面,它们不仅没有任何道德界限,更没有使用门槛,没有…

EtherCAT转Profinet网关连接西门子PLC与凯福科技总线步进驱动器通讯

西门子S7-1200/1500系列的PLC,采用Profinet实时以太网通讯协议,需要连接带EtherCAT的通讯功能的伺服驱动器等设备,就必须进行通讯协议转换。捷米特JM-EIP-RTU系列的网关提供了,快速可行的解决方案 捷米特JM-ECTM-PN在PROFINET一侧…

tomcat

1. 简述静态网页和动态网页的区别。 静态网页是指在服务器存储的网页内容保持不变,不会根据用户的请求或其他条件而改变。它的内容是固定的,无法根据用户的不同需求进行个性化或实时更新。静态网页一般由HTML、CSS和JavaScript等静态资源组成&#xff0…

linux文件描述符fd

文件描述符 fd是一个>0 的整数 每打开一个文件,就创建一个文件描述符,通过文件描述符来操作文件 预定义的文件描述符: 0:标准输入,对应于已打开的标准输入设备(键盘) 1:标准输出,对应于已打开的标准输出设备(控制台) 2.标准错误…

java异常机制分析

java异常机制分析 本文实例分析了java的异常机制,分享给大家供大家参考。相信有助于大家提高大家Java程序异常处理能力。具体分析如下: 众所周知,java中的异常(Exception)机制很重要,程序难免会出错,异常机制可以捕获…

智慧水利整体解决方案[43页PPT]

导读:原文《智慧水利整体解决方案[43页PPT]》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式: 如需获取完整的…

LNMP及论坛搭建(第一个访问,单节点)

LNMP:目前成熟的一个企业网站的应用模式之一,指的是一套协同工作的系统和相关软件 能够提供静态页面服务,也可以提供动态web服务,LNMP是缩写 L:指的是Linux操作系统。 N:指的是nginx,nginx提…