Spring-AOP @AspectJ切点函数之execution()

 

https://blog.51cto.com/u_15239532/2836385

 

文章目录

     概述
     通过execution()定义切点的不同方式
         通过方法签名定义切点
         通过类定义切点
         通过类包定义切点
         通过方法入参定义切点
     实例

概述

execution()是最常用的切点函数,语法如下

execution(<修饰符模式>?<返回类型模式><方法名模式>(<参数模式>)<异常模式>?)

    1.

其中:返回类型模式、方法名模式、参数模式是必选项。
通过execution()定义切点的不同方式

下面我们通过各种实例来理解如何使用execution()
通过方法签名定义切点

    execution(public * *(..)) 匹配所有目标类的public方法。 第一个*代表返回类型,第二个*代表方法名,而..代表任意入参的方法

    execution(* *To(..)) 匹配目标类所有以To为后缀的方法。 第一个*代表返回类型,而*To代表任意以To为后缀的方法。

通过类定义切点

    execution(* com.xgj.aop.spring.advisor.aspectJ.function.execution.classpoint.Cleaner.*(..))匹配Cleaner接口的所有方法(包括实现类中覆写的方法), 第一个 * 代表返回任意类型 ,...Cleaner.*代表Cleaner接口中的所有方法

    execution(* com.xgj.aop.spring.advisor.aspectJ.function.execution.classpoint.Cleaner.*(..))匹配Cleaner接口及其所有实现类的方法,不但匹配实现类中覆写的方法,也包括实现类中不在接口中定义的方法

通过类包定义切点

在类名模式串中,.*表示包下的所有类,..*表示包、子孙包下的所有类

    execution(* com.xgj.*(..))匹配com.xgj包下所有类的所有方法

    execution(* com.xgj..*(..))匹配com.xgj包、子孙包下所有类的所有方法.比如 com.xgj.dao ,com.xgj.service,com.xgj.dao.user包下所有类的所有方法都匹配。 当 ..出现在类名中时,必须后面跟*表示子孙包下的所有类。

    execution(* com..*Dao.find*(..))匹配包名前缀为com的任何包下类名后缀为Dao的方法,方法名必须以find为前缀, 比如com.xgj.UserDao#findUserById()方法都是匹配切点。

通过方法入参定义切点

切点表达式中的方法入参部分比较复杂,可以使用*和..通配符。 其中 *表示任意参数类型的参数, 而..表示任意类型的参数且参数个数不限。

    execution(* joke(String,int))匹配joke(String,int)方法,且joke方法的第一个入参是String,第二个入参是int。 比如 匹配 SmartSeller#joke(String ,int)方法。 如果方法中的入参类型是java.lang包下的,这可以直接使用类名,否则必须使用全限定类名,比如 joke(java.util.List,int)

    execution(* joke(String,*))匹配目标类中的joke()方法,该方法第一个入参为String,第二个入参为任意类型。 比如 joke(String s1, String s2)和joke(String s1,double d)都匹配,但是 joke(String s1, String s2,double d3)不匹配

    execution(* joke(String,..))匹配目标类中的joke方法,该方法的第一个入参为String,后面可以有任意个入参且入参类型不限。 比如 joke(String s1),joke(String s1,String s2)和joke(String s1,double d2,String s3)都匹配。

    execution(* joke(Object+))匹配目标类中的joke()方法,方法拥有一个入参,且入参是Object类型或该类的子类。 它匹配joke(String s1) 和joke(Client c) . 如果定义的切点是execution(* joke(Object)) ,则只匹配joke(Object object)而不匹配joke(String s1) 或者joke(Client c)

实例

代码已托管到Github—> https://github.com/yangshangwei/SpringMaster

仅以通过方法签名定义切点为例子,其余场景请参考https://github.com/yangshangwei/SpringMaster, 亲测通过。

-----------------------------------
©著作权归作者所有:来自51CTO博客作者小小工匠的原创作品,请联系作者获取转载授权,否则将追究法律责任
Spring-AOP @AspectJ切点函数之execution()
https://blog.51cto.com/u_15239532/2836385

posted @   嘉合  阅读(115)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示