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 |