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注解

你可能感兴趣的:(spring)