最近看到关于execution表达式,百度上大多描述得复杂,所以在这里写下通俗一点的解释。
例子:执行( * com.sample.service.impl ..*.*(..) )
执行( * com.hui.readwrite.mapper..*.select*(..) )
| 符号 | 含义 |
|---|---|
| 执行() | 表达式的主体; |
| 第一个*符号 | 表示返回值的类型任意; |
| com.sample.service.impl | AOP所切的服务的包名,即,我们的业务部分 |
| com.hui.readwrite.mapper | AOP所切的服务的包名,通常是mapper层增删改查方法 |
| 包名后面的 .. | 表示当前包及子包 |
| 第二个*符号 | 表示类名,*即所有类。此处可以自定义,下文有举例 |
| .*(..) | 表示任何方法名,括号表示参数,两个点表示任何参数类型 |
| .select*(..) | 表示带select前缀匹配的方法名,括号表示参数,两个点表示任何参数类型 |
以下为各符号解释
| 符号 | 类型匹配模式 |
|---|---|
| * | 匹配任何数量字符;比如模式 (*,String) 匹配了一个接受两个参数的方法,第一个可以是任意类型,第二个则必须是String类型 |
| .. | 匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数,可以使零到多个。 |
| + | 匹配指定类型的子类型;仅能作为后缀放在类型模式后边。 |
| 符号 | 参数匹配模式: |
|---|---|
| () | 匹配了一个不接受任何参数的方法, |
| (..) | 匹配了一个接受任意数量参数的方法(零或者更多)。 |
| (*) | 匹配了一个接受一个任何类型的参数的方法。 |
| (*,String) | 匹配了一个接受两个参数的方法,第一个可以是任意类型, 第二个则必须是String类型。 |
示例:
类型匹配模式// 省略访问修饰符 void com.huge.service.impl.AccountServiceImpl.save() // 返回值使用通配符,表示可以返回任意值 * com.huge.service.impl.AccountServiceImpl.save() // 包名可以使用通配符,表示任意包。但是有几级包,就需要写几个*. * *.*.*.*.AccountServiceImpl.save() // 包名可以使用..表示当前包及其子包 * *..AccountServiceImpl.save() //定义在service 包里,及其子类的任意类的任意方法 * com.huge.service.*.*() // 类名和方法名都可以使用*来实现通配 * *..*.*() // 所有包下的service,及其子包 * *.service..*() // IAccountService 若为接口,则为接口中的任意方法及其所有实现类中的任意,方法; //若为类,则为该类及其子类中的任意方法 * com.huge.service.IAccountService+.*() // 以s开头的任意方法 * com.huge.service.*.s*()参数匹配模式
// 基本类型直接写名称 int * com.huge.service.*.*(int) // 方法不带参数的 * com.huge.service.*.*() // 可以使用..表示有无参数均可,有参数可以是任意类型 * com.huge.service.*.*(..) // 两个参数,第一个是String,第二个任意,三个参数不行 execution(* joke(String,*))) // 两个参数,第一个String,第二个个数和类型不限 execution(* joke(String,..))) // 全通配写法: * *..*.*(..)
借阅:https://blog.csdn.net/weixin_44122191/article/details/117264684



