Spring Aop只支持Spring Bean的方法执行连接点, 所以可以把一个切入点视为Spring Bean上方法的执行
切入点
使用@Pointcut
来声明一个切入点
支持的切入点指示符
切入点指示符 | 含义 |
---|---|
execution | 匹配执行方法的连接点 |
within | 匹配指定类型内的执行方法 |
this | 匹配当前AOP代理对象类型的执行方法(可能包括引入接口) |
target | 匹配当前目标对象类型的执行方法(不包括引入接口) |
args | 匹配当前执行的方法传入的参数为指定类型的执行方法 |
@target | 匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解 |
@within | 匹配所以持有指定注解类型内的方法 |
@args | 匹配当前执行的方法传入的参数持有指定注解的执行 |
@annotation | 匹配当前执行方法持有指定注解的方法 |
结合切入点表达式
切入点表达式可以使用’&&’,’||’ 和“!”来进行组合
@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {}
@Pointcut("within(com.xyz.someapp.trading..*)")
private void inTrading() {}
@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {}
execution(方法表达式)
表达式规则:
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?)
名称 | 含义 |
---|---|
modifiers-pattern | 方法修饰符 可省略 |
ret-type-pattern | 返回类型 不可省略 |
declaring-type-pattern | 声明类型(类型表达式) 可省略 |
name-pattern | 方法名称 不可省略 |
param-pattern | 参数类型 不可省略 |
throws-pattern | 异常类型 可省略 |
- 大多数情况下,您将
*
用作返回类型,它匹配任何返回类型*
可用作方法名称的全部或部分- 如果指定一个类型表达式,则包含一个尾部
.
来加入方法名称- 参数模式稍微复杂一点:
()
匹配一个不带参数的方法(..)
匹配任意数量的参数(零个或多个)(*)
匹配带有一个参数的方法(*,String)
匹配一个方法采取两个参数,第一个可以是任何类型,第二个必须是一个字符串
常见方法表达式:
方法表达式 | 含义 |
---|---|
execution(public * *(..)) | 执行任何公共方法 |
execution(* set*(..)) | 以“set”开头的任何方法的执行 |
execution(* com.xyz.service.AccountService.*(..)) | AccountService接口定义的任何方法的执行 |
execution(* com.xyz.service..(..)) | 执行service包中定义的任何方法 |
execution(* com.xyz.service...(..)) | 执行service包或子包中定义的任何方法 |
within(类型表达式)
类型表达式 | 含义 |
---|---|
within(com.xyz.service..*) | service包以及子包下的任何方法 |
this(类型全限定名) 不支持通配符
类型全限定名 | 含义 |
---|---|
this(com.xyz.service.IAccountService) | 当前AOP对象实现的IAccountService接口的任何方法 |
target(类型全限定名) 不支持通配符
类型全限定名 | 含义 |
---|---|
target(com.xyz.service.IAccountService) | 当前目标对象实现的IAccountService接口的任何方法 |
args(参数类型表达式)
参数必须是类型全限定名,通配符不支持;
args属于动态切入点,这种切入点开销非常大
参数类型表达式 | 含义 |
---|---|
args(java.lang.String, ..) | 任何第一个参数为String的方法 |
@within(注解类型)
注解类型必须是全限定类型名
注解必须声明在目标对象上(接口声明不起作用)
注解类型 | 含义 |
---|---|
@within(com.xyz.annotation.Service) | 持有该注解的目标对象的所有方法 |
@target(注解类型)
注解类型必须是全限定类型名
注解必须声明在目标对象上(接口声明不起作用)
注解类型 | 含义 |
---|---|
@target(com.xyz.annotation.Service) | 持有该注解的目标对象的所有方法 |
@args(注解列表)
注解类型必须是全限定类型名
动态切入点
注解列表 | 含义 |
---|---|
@args(com.xyz.annotation.Service) | 任何一个只有一个参数的方法,且参数持有Service注解 |
@annotation(注解类型)
注解类型必须是全限定类型名
注解类型 | 含义 |
---|---|
@annotation(com.xyz.annotation.Service) | 当前执行方法上持有Service注解 |