【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.rhkb.cn/news/74490.html

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

相关文章

【Golang】基于录制,自动生成go test接口自动化用例

目录 背景 框架 ginkgo初始化 抓包&运行脚本 目录说明 ∮./business ∮./conf ∮./utils ∮./testcase testcase 用例目录结构规则 示例 实现思路 解析Har数据 定义结构体 解析到json 转换请求数据 转换请求 转换请求参数 写业务请求数据 写gotest测试…

Abaqus 导出单元刚度矩阵和全局刚度矩阵

Abaqus 导出单元刚度矩阵和全局刚度矩阵 首次创建:2023.7.29 最后更新:2023.7.29 如有什么改进的地方,欢迎大家讨论! 详细情况请查阅:Abaqus Analysis User’s Guide 一、Abaqus 导出单元刚度矩阵 1.生成单元刚度矩阵…

【MySQL】数据类型

上期我们在建表的时候用到了很多数据类型,下面就来详细讲解这些数据类型 目录 一、数据类型分类 二、对于一些数据类型的分析 2.1 数值类型 2.1.1 有符号和无符号类型 2.1.2 bit类型 2.1.3 浮点型 2.1.3.1 float 2.1.3.2 decimal 2.2 字符串类型 2.2.1 ch…

数据结构--基础知识

数据结构是什么? 数据结构是计算机科学中研究数据组织、存储和管理的方法和原则。它涉及存储和操作数据的方式,以便能够高效地使用和访问数据。 相关内容 基本组成 数组(Array):数组是一种线性数据结构,…

数据管理基础知识

数据管理原则 数据管理与其他形式的资产管理的共同特征,涉及了解组织拥有哪些数据以及可以使用这些数据完成哪些工作,然后确定如何最好的使用数据资产来实现组织目标与其他流程一样,他必须平衡战略和运营需求,通过遵循一套原则&a…

【Linux】揭秘:提升dd命令效率的秘密武器!

红帽RHCE试听课程:如何快速实现对服务器密码爆破?https://mp.weixin.qq.com/s/JUpf8G86jvnNwvKLUfWcLQ 红帽RHCE试听课程:linux系统下,用这个命令可以提高60%的工作效率https://mp.weixin.qq.com/s/pZVjMI1PLJzrA8hoPzkgMA 大家好…

机器学习深度学习——Dropout

👨‍🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——权重衰减 📚订阅专栏:机器学习&&深度学习 希望文章对你们有所帮助 Drop…

使用火山云搜索ESCloud服务构建图文检索应用(以文搜图/以图搜图)

图文检索在生活中具有广泛的应用,常见的图片检索包括基于文本内容搜索和基于图片内容搜索。用户通过输入文字描述或上传图片就可以在海量的图片库中快速找到同款或者相似图片,这种搜索方式被广泛应用于电商、广告、设计以及搜索引擎等热门领域。 本文基…

TCP三次握手四次挥手

一、TCP三次握手四次挥手 1.三次握手: 第一次握手:客户端发送syn包(seqx)到服务器,并进入SYN_SEND(发送)状态,等待服务器确认; 第二次握手:服务器收到syn包,必须确认客户的SYN(ac…

redis五种数据类型介绍

、string(字符串) 它师最基本的类型,可以理解为Memcached一模一样的类型,一个key对应一个value。 注意:一个键最大能存储 512MB。 特性:可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512…

计划管理与项目管理:有何区别?

简而言之,是的。尽管它们经常互换使用并对全局产生影响,但它们是完全不同的。 在本文中,我们将了解计划和项目管理之间的差异,提供每个示例,并向您展示如何使计划和项目管理工作更有效地实现您的业务目标。 计划管理与…

程序员面试金典17.*

文章目录 17.01 不用加号的加法17.04 消失的数字17.05字母与数字17.06 2出现的次数17.07 婴儿名字17.08 马戏团人塔17.09 第k个数17.10 主要元素17.11 单词距离17.12 BiNode17.13 恢复空格(未做,字典树dp)17.14 最小K个数17.15 最长单词17.16…

python爬虫-加速乐cookie混淆解析实例小记

注意!!!!某XX网站逆向实例仅作为学习案例,禁止其他个人以及团体做谋利用途!!! 第一步:抓包工具第一次请求页面,得到响应。本次我使用的fiddle进行抓包&#…

网易云音乐扫码登录

简介 尚硅谷的网易云音乐项目无法登录,因为目前网易修改了接口使用手机号和密码登录的话需要先通过认证才可以,所以目前无法使用手机号登录,只能使用二维码登录,接下来我就教大家如何使用 二维码进行登录 实现步骤 1.获取nodejs接…

【1.4】Java微服务:服务注册和调用(Eureka和Ribbon实现)

✅作者简介:大家好,我是 Meteors., 向往着更加简洁高效的代码写法与编程方式,持续分享Java技术内容。 🍎个人主页:Meteors.的博客 💞当前专栏: 微服务 ✨特色专栏: 知识分享 &#x…

排序八卦炉之选择、堆排

文章目录 1.选择排序1.1代码实现1.2复杂度 2.堆排序2.1代码实现2.2复杂度 1.选择排序 1.1代码实现 // 当数据趋于有序或随机(可能部分有序) 插排更有优势 O(N)~O(N^2) //选择排序:O(N^2) O(N^2)~O(N^2) void …

【shell】获取ping的时延数据并分析网络情况及常用命令学习

文章目录 获取ping的时延数据并分析网络情况|、||、&、&&辨析teetailkillall 获取ping的时延数据并分析网络情况 网络情况经常让我们头疼,每次都需要手动在终端ping太麻烦了,不如写个脚本ping并将数据带上时间戳存入文件,然后也…

如何克服看到别人优于自己而感到的焦虑和迷茫?

文章目录 每日一句正能量前言简述自己的感受怎么做如何调整自己的心态后记 每日一句正能量 行动是至于恐惧的良药,而犹豫、拖延,将不断滋养恐惧。 前言 虽然清楚知识需要靠时间沉淀,但在看到自己做不出来的题别人会做,自己写不出的…

软件测试缺陷报告

缺陷报告是描述软件缺陷现象和重现步骤地集合。软件缺陷报告Software Bug Report(SBR)或软件问题报告Software Problem Report(SPR) 作用:缺陷报告是软件测试人员的工作成果之一,体现软件测试的价值缺陷报…

Pytorch深度学习-----神经网络之线性层用法

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用(ToTensor,Normalize,Resize ,Co…