Spring AOP 表达式详解

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异常类型 可省略
  • 大多数情况下,您将*用作返回类型,它匹配任何返回类型
  • * 可用作方法名称的全部或部分
  • 如果指定一个类型表达式,则包含一个尾部. 来加入方法名称
  • 参数模式稍微复杂一点:
    1. ()匹配一个不带参数的方法
    2. (..)匹配任意数量的参数(零个或多个)
    3. (*)匹配带有一个参数的方法
    4. (*,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注解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值