持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情
- AOP作为spring亮点之一,简直是太好用了。首先我们可以通aop实现很多重复的功能。切面就需要1个切点。切点我们就方便行动。具体如下
10种切点表达式
AspectJ的切点指示符AspectJ pointcut designators (PCD) ,也就是俗称的切点表达式,Spring中支持10种,如下表:
| 表达式类型 | 作用 | 匹配规则 |
|---|---|---|
execution | 用于匹配方法执行的连接点 | |
within | 用于匹配指定类型内的方法执行 | within(x)匹配规则target.getClass().equals(x) |
this | 用于匹配当前AOP代理对象类型的执行方法,包含引入的接口类型匹配 | this(x)匹配规则:x.getClass.isAssingableFrom(proxy.getClass) |
target | 用于匹配当前目标对象类型的执行方法,不包括引入接口的类型匹配 | target(x)匹配规则:x.getClass().isAssignableFrom(target.getClass()); |
args | 用于匹配当前执行的方法传入的参数为指定类型的执行方法 | 传入的目标位置参数.getClass().equals(@args(对应的参数位置的注解类型))!= null |
@target | 用于匹配当前目标对象类型的执行方法,其中目标对象持有指定的注解 | target.class.getAnnotation(指定的注解类型) != null |
@args | 用于匹配当前执行的方法传入的参数持有指定注解的执行 | 传入的目标位置参数.getClass().getAnnotation(@args(对应的参数位置的注解类型))!= null |
@within | 用于匹配所有持有指定注解类型内的方法 | 被调用的目标方法Method对象.getDeclaringClass().getAnnotation(within中指定的注解类型) != null |
@annotation | 用于匹配当前执行方法持有指定注解的方法 | target.getClass().getMethod("目标方法名").getDeclaredAnnotation(@annotation(目标注解))!=null |
bean | Spring AOP扩展的,AspectJ没有对应的指示符,用于匹配特定名称的Bean对象的执行方法 | ApplicationContext.getBean("bean表达式中指定的bean名称") != null |
简单介绍下AspectJ中常用的3个通配符:
*:匹配任何数量字符..:匹配任何数量字符的重复,如任何数量子包,任何数量方法参数+:匹配指定类型及其子类型,仅作为后缀防过载类型模式后面。