切点表达式格式详解
在Spring AOP中,@Around注解的切点表达式遵循AspectJ切点表达式语法,其核心结构为:
指示符(匹配模式),通过逻辑运算符组合多个条件。以下是具体规则和示例:
一、基础语法结构
- 执行匹配(最常用)
execution([访问修饰符] 返回类型 [类路径]. [异常类型]) 示例:
execution(* com.example.service..(…))
* 匹配任意返回类型
com.example.service.*:匹配该包下所有类
.*(…):匹配所有方法(任意方法名+任意参数) - 其他常用指示符
二、逻辑运算符
通过 &&(与)、||(或)、!(非)组合条件:
@Around("execution(* com.example.service.*.*(..)) &&@annotation(com.example.Transactional)")
表示:匹配service包下所有方法,且方法被@Transactional注解修饰。
三、常见表达式示例
- 匹配Service层所有public方法:
execution(public * com.example.service.*.*(..))
- 匹配特定注解的方法:
@annotation(com.example.Cacheable)
- 匹配参数为String类型的方法:
args(java.lang.String)
- 排除某些方法:
execution(* com.example.service.*.*(..)) && !execution(* com.example.service.UserService.delete*(..))
四、注意事项
- 性能优化:
避免过于宽泛的表达式(如execution(* .(…))),尽量缩小匹配范围。 - 包路径准确性:
使用完整包路径(如com.example而非example),避免因路径模糊导致匹配失败。 - 访问修饰符默认规则:
若省略访问修饰符(如execution(* *(…))),默认匹配public方法。
五、进阶技巧
- 组合注解匹配:
@Around("@within(org.springframework.stereotype.Service)")
匹配所有被@Service注解的类中的方法。
2. 通过接口匹配:
execution(* com.example.service.UserService+.*(..))
匹配UserService接口及其实现类的方法。
通过合理设计切点表达式,可精准控制切面的作用范围,提升代码可维护性和性能。建议通过AOP调试工具(如Spring AOP Proxy Logging)验证表达式匹配结果。