当前位置: 首页 > article >正文

AOP切点表达式之方法表达式execution


天行健,君子以自强不息;地势坤,君子以厚德载物。


每个人都有惰性,但不断学习是好好生活的根本,共勉!


文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。


君不见,黄河之水天上来,奔流到海不复回。
君不见,高堂明镜悲白发,朝如青丝暮成雪。
——《将进酒


文章目录

  • AOP切点表达式之方法表达式execution
    • 1. 表达式语法和参数说明
    • 2. 常用表达式举例
      • 2.1 拦截指定包下所有类的所有方法(不包含该包下的子包)
      • 2.2 拦截指定包下所有类的所有方法(包含该包下的子包)
      • 2.3 拦截指定包下一级子包的所有类的所有方法(不包含该包下的子包下的子包)
      • 2.4 拦截当前包下指定类的所有方法
      • 2.5 拦截指定包下指定类的所有公共(public)方法
      • 2.6 拦截指定包下指定类的所有返回值类型为Integer的方法
      • 2.7 拦截指定包下指定类的所有入参第一个参数为String的方法
      • 2.8 拦截所有带有指定注解的所有方法
    • 3. 组合表达式
      • 3.1 与&&
      • 3.2 或||
      • 3.3 非!
    • 4. 注意事项
      • 4.1 Tips1
      • 4.2 Tips2
      • 4.3 Tips3
  • 加分加分
    • 1. 加分
    • 2. 加分
    • 3. 加分
    • 4. 加分
      • 4.1 加分1
      • 4.2 加分2
      • 4.3 加分3
      • 4.4 加分4


AOP切点表达式之方法表达式execution

关于aop的完整详细版可跳转到链接:Java AOP 介绍与实践

使用execution(方法表达式)进行匹配方法执行

1. 表达式语法和参数说明

语法

execution([修饰符] 返回类型 [包.类.方法] (参数))

其中方括号[]中的参数是可以加上也可以不加

参数说明

  • 修饰符
    可选,指定方法的访问修饰符,如public、private等
  • 返回类型
    必填,指定方法的返回类型,可用*表示匹配任意类型
  • 包.类.方法
    可选,指定类和方法的全限定名,*表示匹配任意类型或者方法
  • 参数
    必填,指定方法的参数列表,…表示匹配任意参数

2. 常用表达式举例

2.1 拦截指定包下所有类的所有方法(不包含该包下的子包)

如拦截com.aop.controller包下的所有类的方法
表达式

execution(* com.aop.controller.*.*(..))

说明

匹配指定包中的所有方法
第一个*表示所有返回值类型
com.aop.controller是包的全限定名
第二个*是所有类,第三个*是所有方法
最后的(..)是参数,表示任意参数

2.2 拦截指定包下所有类的所有方法(包含该包下的子包)

如拦截com.aop包下的所有类的方法,包含其子包下的类的所有方法
如com.aop.common包下的类的所有方法
com.aop.controller包下的类的所有方法
com.aop.common.test包下的类的所有方法
等等
都会被拦截到

表达式

execution(* com.aop..*.*(..))

或者直接省略类的表示

execution(* com.aop..*(..))

说明

匹配指定包中的所有方法,包含其子包下的类的所有方法
第一个*表示所有返回值类型
com.aop是包的全限定名
第二个*是所有类,第三个*是所有方法
最后的(..)是参数,表示任意参数

2.3 拦截指定包下一级子包的所有类的所有方法(不包含该包下的子包下的子包)

如拦截com.aop包下一级子包的所有类的方法,不包含一级子包下的子包的类的所有方法
如com.aop.common包下的类的所有方法
com.aop.controller包下的类的所有方法
等等
都会被拦截到
而com.aop包下子包的子包则不会拦截
如com.aop.common.test包下的类的所有方法不会被拦截

表达式

execution(* com.aop.*.*.*(..))

说明

匹配指定包中的所有方法,包含其子包下的类的所有方法
第一个*表示所有返回值类型
com.aop.*是包的全限定名
第二个*是aop包下一级的所有包,不含其下一级以下的子包
第三个*是所有类,第四个*是所有方法
最后的(..)是参数,表示任意参数

2.4 拦截当前包下指定类的所有方法

当前包指的是切面类所在的包
如切面类AopAspectJ.java类在com.aop.common包下,则该包就是当前包,此时匹配时无需加包名
如拦截当前包下的指定类AopTest2Controller.java的所有方法

表达式

execution(* AopTest2Controller.*(..))

也可使用*模糊匹配类名
如前缀匹配,匹配以AopTest2开头的类名

execution(* AopTest2*.*(..))

后缀匹配,匹配以2Controller结尾的类名

execution(* *2Controller.*(..))

2.5 拦截指定包下指定类的所有公共(public)方法

方法修饰符可以是public、private等,可根据修饰符不同进行匹配
如拦截com.aop.common包下AopTest2Controller.java类中所有public修饰的方法

表达式

execution(public * com.aop.common.AopTest2Controller.*(..))

2.6 拦截指定包下指定类的所有返回值类型为Integer的方法

返回值类型可以是很多种类型,如String、Integer、Object等
如拦截com.aop.common包下AopTest2Controller.java类中所有返回类型为Integer的方法

表达式

execution(Integer com.aop.common.AopTest2Controller.*(..))

这里需要注意,使用的是Integer而非int,我这里试了下int会报错,你可以测试一下,暂时不清楚原因

2.7 拦截指定包下指定类的所有入参第一个参数为String的方法

方法的参数列表可以多样的,可精准匹配指定入参的方法
如拦截com.aop.common包下AopTest2Controller.java类中所有第一个入参为String类型的方法

表达式

execution(* com.aop.common.AopTest2Controller.*(String, ..))

2.8 拦截所有带有指定注解的所有方法

拦截带有某个注解的所有方法
如拦截带有@Scheduled注解的所有方法,注解需要使用全限定名(即@加上import后面跟的全部)
所有带有@Scheduled注解的方法在自动执行时都会被拦截

表达式

execution(@org.springbframework.scheduling.annotation.Scheduled * *(..))

3. 组合表达式

通过与或非(and/or/not)进行组合表达式拦截

3.1 与&&

使用&&来实现同时满足两个或多个条件的

execution(* com.aop.common.AopTest2Controller.*(..)) && execution(* com.aop.controller.AopTestController.*(..))

3.2 或||

使用||来实现多个条件匹配(满足其一即可)
如拦截com.aop.common.AopTest2Controller类或com.aop.controller.AopTestController下的所有方法

execution(* com.aop.common.AopTest2Controller.*(..)) || execution(* com.aop.controller.AopTestController.*(..))

3.3 非!

使用!来实现排除某种情况之外的部分执行(非的符号位英文感叹号!)
如拦截com.aop.common.AopTest2Controller类所有方法以外的所有方法

!execution(* com.aop.common.AopTest2Controller.*(..))

4. 注意事项

4.1 Tips1

在使用表达式时,包的路径在开始包com后至少加上一级包名,后面才可以使用*进行模糊匹配,即,开始都需要以com.aop开始(我这里com下面是aop,你根据自己的包名进行使用),后面进行模糊匹配定义
com.aop.*.*.*(..),每一个*代表一级包,最后的两个*表示类和方法
..表示多级包,如com.aop..*(..),表示aop下的所有方法包括其子包

4.2 Tips2

在使用带有Integer的表达式时,在方法的返回值类型上,需定义包装类,也就是Integr,而不是int,不然会报错(org.springframework.aop.AopInvocationException: Null return value from advice does not match primitive return type for: public int com.aop.common.Test4Controller.test1())

4.3 Tips3

在使用最后一个定时任务注解时,需要先参考文章实现定时任务功能,再进行aop的配置
Java定时任务@Scheduled的使用


感谢阅读,祝君暴富!


版权声明:

  • 作者:寒山李白
  • 博客地址:https://hanshan.blog.csdn.net/
  • 版权:本作品采用《创作共享许可证》进行许可,根据该许可授权的内容可在符合本许可证条款的前提下自由使用、、修改和创作衍生作品。

版权许可介绍:
本文采用CC BY-NC-SA许可证
此许可允许在使用者仅出于非商业目的以任何媒体或格式分发、重新混合、改编和构建材料,并且前提是注明创作者。如果您重新混合、改编或基于该材料进行构建,则必须按照相同的条款对修改后的材料进行许可。

更多信息请访问以下网址查看:
版权官网 https://creativecommons.org/licenses/by-nc-sa/4.0/
中文翻译 https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh-hans


文章结束

--------------------------------------------------------------------------------------------------------------------------------------

以下内容增加文章评分用,可忽略

加分加分

黄河之水天上来,奔流到海不复回
高堂明镜悲白发,朝如青丝暮成雪

1. 加分

黄河之水天上来,奔流到海不复回
高堂明镜悲白发,朝如青丝暮成雪

2. 加分

黄河之水天上来,奔流到海不复回
高堂明镜悲白发,朝如青丝暮成雪

3. 加分

寒山李白
寒山李白

4. 加分

账号密码

名称密码
李白123

4.1 加分1

账号密码

名称密码
李白123

4.2 加分2

账号密码

名称密码
李白123

4.3 加分3

账号密码

名称密码
李白123

4.4 加分4

账号密码

名称密码
李白123


http://www.kler.cn/a/449207.html

相关文章:

  • shardingsphere分库分表项目实践1-让shardingsphere运行起来
  • UG NX二次开发(C#)-机电概念设计-UIStyler中selection块选择信号等对象的过滤器设置
  • Cline 3.0发布:从AI编程助手到通用智能体平台的进化
  • mysql-主从同步与读写分离
  • 电脑开机提示error loading operating system怎么修复?
  • 36. Three.js案例-创建带光照和阴影的球体与平面
  • FreeSwitch中启用WebRTC
  • 软件测试经典面试题(答案解析+文档)
  • 最优二叉搜索树【东北大学oj数据结构10-4】C++
  • Maven构建Java项目ES项目
  • 【总结(三)】单片机重点知识总结记录(串口重定向+按键消抖+延时)
  • B6充电器模式
  • Net9为PDF文字替换,使用Spire.PDF版本10.12.4.1360
  • Paddle OCR 中英文检测识别 - python 实现
  • PostgreSQL编译安装教程
  • C++ 的IO流
  • 如何找到一篇文献/论文/会议的引用,以及分清自己使用的引用格式
  • 20241230 机器学习ML -(1)线性回归(scikitlearn)
  • 标贝科技受邀出席2024ADD数据应用场景大会 共议数据要素发展新契机
  • 基于SSM+Vue的心理咨询问诊系统+LW示例参考
  • 基于Vue.js和SpringBoot的笔记记录分享网站的设计与实现(文末附源码)
  • PHP 新手教程:从入门到构建简单网页
  • 感知机与逻辑回归的异同点
  • 【CDN】快速了解CDN是什么?以及工作原理和应用场景
  • 事件响应基本流程
  • Why SAP TM?