Spring AOP 切入点表达式

1. 切入点的标识符

Spring AOP 中目前只有执行方法这一个连接点,其支持的AspectJ切入点标识符如下:

标识符 功能
execution 匹配方法执行的连接点
within 匹配指定的类及其子类中的所有方法
this 匹配可以向上转型为this指定的类型的代理对象中的所有方法
target 匹配可以向上转型为target指定的类型的目标对象中的所有方法
args 匹配运行时传入的参数列表的类型为指定的参数列表类型的方法
@within 匹配持有指定注解的类的所有方法
@target 匹配持有指定注解目标对象的所有方法
@args 匹配运行时方法传入的参数所属的类持有指定注解的方法
@annotation 匹配持有指定注解的方法

2. 常用切入点表达式详解

符号 含义
* 匹配任意数量字符
.. 匹配任何数量字符的重复,如在类型模式中匹配任何数量子包;而在方法参数模式中匹配任何数量参数
+ 匹配指定类型的子类型,仅能作为后缀放在类型模式后边

2.1 execution

execution的匹配模式是[访问修饰符] [方法返回值] [包名.类名.方法名] (方法参数),除了返回值、方法名和参数外,另外两项都是可选的

#匹配任意类任意返回值任意参数数量及类型的 public 方法
@Before(value = "execution(public * *(..))")

#匹配任意以To为后缀的方法
@Before(value = "execution(* *To(..))")

#匹配Writer接口中及其实现类的方法
@Before(value = "execution(* com.aop.service.Writer+.*(..))")

#匹配 com.aop.service 包下所有类的所有方法
@Before(value = "execution(* com.aop.service.*(..))")

# 匹配所有第一个参数为 String 类型,第二个参数为 int 类型的 save 方法
@Before(value = "execution(* save(String,int))")

#匹配除第一个参数固定为 String 外,后面有任意个入参且入参类型不限的 save 方法
@Before(value = "execution(* save(String,..))")

2.2 target

target表示当被代理的目标对象可以被转换为指定的类型时则匹配成功

#表示匹配实现了 GodService 接口的目标对象的所有方法
@Around(value = "target(aop.service.GodService)")  

2.3 @args

匹配方法传入的参数所属类上拥有指定的注解的情况

# 匹配方法参数类型上拥有 MyAnnotation 注解的方法调用。例如有一个方法add(MyParam param)
#接收一个MyParam类型的参数,而 MyParam 这个类是拥有注解 MyAnnotation 的,则它可以被匹配上
@Around(value = "@args(com.spring.support.MyAnnotation)")

2.4 @annotation

用于匹配方法上拥有指定注解的情况,最常使用

# 匹配所有拥有 MyAnnotation 注解的外部调用方法
@annotation(com.elim.spring.support.MyAnnotation)
发布了97 篇原创文章 · 获赞 88 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_45505313/article/details/104442007