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注解 |
本文详细介绍了Spring AOP中的切入点概念及其使用方法,包括@Pointcut注解的应用,以及各种切入点指示符如execution、within等的规则与实例。
350

被折叠的 条评论
为什么被折叠?



