execution
表达式的使用execution(访问修饰符(可省略) 返回值类型 包.包.类.方法名(参数) )
如
<aop:before method="printLog" pointcut="execution(public void com.huge.service.impl.AccountServiceImpl.save())"></aop:before>
符号 | 类型匹配模式 |
---|---|
* | 匹配任何数量字符;比如模式 (*,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,..)))
// 全通配写法:
* *..*.*(..)