AspectJ 表达式中常见符号说明
AspectJ 表达式中常见符号说明
一、通配符(Wildcard Symbols)
符号 | 说明 | 示例 | 适用场景 |
---|---|---|---|
* | 通配符,匹配任意数量字符(方法名、返回值、包路径等)。 | execution(* set*(..)) :匹配以 set 开头的方法。 | 方法名、返回值、包路径的模糊匹配。 |
.. | 1. 在方法参数中表示任意数量、任意类型的参数。 2. 在包路径中表示当前包及其所有子包。 | execution(* com.example.service..*.*(..)) :匹配 com.example.service 及其子包下的所有方法。 | 包路径的层级匹配,方法参数的泛化匹配。 |
+ | 匹配指定类型及其子类型(类或接口)。 | execution(* joke(Object+)) :匹配 joke 方法,参数为 Object 或其子类(如 String 、User )。execution(* com.example.service.UserService+.save*(..)) :匹配 UserService 及其子类的所有 save 方法。 | 类型继承关系的匹配,包括类、接口及其子类/实现类。 |
二、切入点指示符(Pointcut Designators)
指示符 | 说明 | 示例 | 适用场景 |
---|---|---|---|
execution | 匹配方法执行的连接点(最常用)。 | execution(* com.example.service.*.save*(..)) :匹配 com.example.service 包下所有类的 save 方法。execution(* com.example.service.UserService+.save*(..)) :匹配 UserService 及其子类的 save 方法。 | 方法级别的精确匹配,支持 + 用于类型继承。 |
within | 匹配指定类型或包内的方法执行。 | within(com.example.service.*) :匹配 com.example.service 包下的所有方法(不包括子包)。 | 包级别的粗粒度匹配。 |
this | 匹配代理对象的类型。 | this(com.example.service.UserService) :匹配 UserService 接口的代理对象的方法。 | 代理对象的类型匹配(包括引入接口)。 |
target | 匹配目标对象的类型。 | target(com.example.service.UserService) :匹配目标对象为 UserService 的方法。 | 目标对象的类型匹配(不包括引入接口)。 |
args | 匹配方法参数为指定类型。 | args(String, Integer) :匹配参数为 String 和 Integer 的方法。 | 方法参数类型的精确匹配。 |
@annotation | 匹配带有指定注解的方法。 | @annotation(org.springframework.transaction.annotation.Transactional) :匹配所有标注 @Transactional 的方法。 | 注解驱动的切点匹配。 |
@args | 匹配方法参数持有指定注解。 | @args(com.example.annotation.Loggable) :匹配参数被 @Loggable 注解修饰的方法。 | 参数注解的匹配。 |
@within | 匹配持有指定注解的类型内的方法。 | @within(com.example.annotation.Service) :匹配所有被 @Service 注解的类中的方法。 | 类级别注解的匹配。 |
@target | 匹配目标对象持有指定注解。 | @target(com.example.annotation.Security) :匹配目标对象被 @Security 注解修饰的方法。 | 目标对象注解的匹配。 |
bean | Spring AOP 扩展,匹配特定名称的 Bean 方法。 | bean(userService) :匹配名为 userService 的 Bean 的所有方法。 | 按 Bean 名称匹配方法。 |
三、组合与嵌套
1. 组合多个条件
- 使用
&&
表达式组合多个切入点条件:execution(* com.example.service.*.save*(..)) && @annotation(org.springframework.transaction.annotation.Transactional)
- 作用:匹配
com.example.service
包中所有以save
开头且标注@Transactional
的方法。
- 作用:匹配
2. 命名切点(@AspectJ 风格)
- 定义命名切点后,可通过
@annotation
引用:@Pointcut("execution(* com.example.service.*.*(..))") private void serviceMethods() {}@Before("serviceMethods()") public void logServiceMethods(JoinPoint joinPoint) {// 前置通知逻辑 }
- 作用:将切点逻辑模块化,便于复用。
四、常见表达式示例
场景 | 表达式 | 说明 |
---|---|---|
匹配任意公共方法 | execution(public * *(..)) | 匹配所有 public 方法。 |
匹配所有 setXXX 方法 | execution(* set*(..)) | 方法名以 set 开头。 |
匹配特定包下的所有方法 | execution(* com.example.service.*.*(..)) | 匹配 com.example.service 包下所有类的方法(不含子包)。 |
匹配包及子包下的所有方法 | execution(* com.example.service..*.*(..)) | .. 表示包含子包。 |
匹配所有 joke 方法且参数为 Object 或其子类 | execution(* joke(Object+)) | + 表示类型及其子类。 |
匹配所有标注 @Transactional 的方法 | @annotation(org.springframework.transaction.annotation.Transactional) | 注解驱动的匹配。 |
匹配 UserService 及其子类的 save 方法 | execution(* com.example.service.UserService+.save*(..)) | + 表示类型继承关系。 |
五、注意事项
-
性能优化:
- 尽量使用具体的
execution
表达式,避免过度使用*
和..
,减少扫描范围。 - 命名切点(
@Pointcut
)可提高代码可读性和复用性。
- 尽量使用具体的
-
Spring AOP 限制:
- Spring AOP 仅支持
execution
、within
、this
、target
、args
、@annotation
等指示符。 call
、get
、set
等 AspectJ 指示符在 Spring AOP 中不可用。+
符号:Spring AOP 支持+
在execution
表达式中用于类型继承匹配,但需注意代理机制(仅代理接口或类)。
- Spring AOP 仅支持
-
通配符优先级:
*
的匹配范围最大,需谨慎使用,避免匹配到非目标方法。..
在包路径中表示层级递归,需注意是否包含子包。+
用于类型继承,需确保匹配的类/接口存在子类或实现类。