当前位置: 首页 > news >正文

AspectJ 表达式中常见符号说明

AspectJ 表达式中常见符号说明


一、通配符(Wildcard Symbols)

符号说明示例适用场景
*通配符,匹配任意数量字符(方法名、返回值、包路径等)。execution(* set*(..)):匹配以 set 开头的方法。方法名、返回值、包路径的模糊匹配。
..1. 在方法参数中表示任意数量、任意类型的参数。
2. 在包路径中表示当前包及其所有子包。
execution(* com.example.service..*.*(..)):匹配 com.example.service 及其子包下的所有方法。包路径的层级匹配,方法参数的泛化匹配。
+匹配指定类型及其子类型(类或接口)。execution(* joke(Object+)):匹配 joke 方法,参数为 Object 或其子类(如 StringUser)。
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):匹配参数为 StringInteger 的方法。方法参数类型的精确匹配。
@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 注解修饰的方法。目标对象注解的匹配。
beanSpring 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*(..))+ 表示类型继承关系。

五、注意事项

  1. 性能优化

    • 尽量使用具体的 execution 表达式,避免过度使用 *..,减少扫描范围。
    • 命名切点(@Pointcut)可提高代码可读性和复用性。
  2. Spring AOP 限制

    • Spring AOP 仅支持 executionwithinthistargetargs@annotation 等指示符。
    • callgetset 等 AspectJ 指示符在 Spring AOP 中不可用。
    • + 符号:Spring AOP 支持 +execution 表达式中用于类型继承匹配,但需注意代理机制(仅代理接口或类)。
  3. 通配符优先级

    • * 的匹配范围最大,需谨慎使用,避免匹配到非目标方法。
    • .. 在包路径中表示层级递归,需注意是否包含子包。
    • + 用于类型继承,需确保匹配的类/接口存在子类或实现类。

http://www.dtcms.com/a/288267.html

相关文章:

  • GoogleBenchmark用法
  • 环形区域拉普拉斯方程傅里叶级数解
  • 电阻耐压参数学习总结
  • 再谈进程-控制
  • 敏感词 v0.27.0 新特性之词库独立拆分
  • 5-大语言模型—理论基础:注意力机制优化
  • 关于个人博客系统的测试报告
  • Typecho评论系统集成Markdown编辑器完整教程
  • Windows事件查看器完整指南
  • 最少标记点问题:贪心算法解析
  • 深入了解 find_element 方法:Web 自动化定位元素的核心​
  • Linux某个进程CPU占用率高原因定位手段
  • Vue基础(前端教程①-路由)
  • 从 C# 转 Python 第三天:文件操作、异常处理与错误日志实践
  • 量子计算与AI融合的技术突破与实践路径
  • 物联网系统中-告警配置功能的定义
  • #Datawhale组队学习#7月-强化学习Task2
  • Java行为型模式---状态模式
  • python类Keys
  • kombu 运行超长时间任务导致RabbitMQ消费者断开
  • 智能制造——解读39页汽车行业数字化工厂解决方案【附全文阅读】
  • 【RK3576】【Android14】调试方法
  • JavaSE-接口
  • Buildroot vs Yocto:SDK 构建机制的核心差异与实践案例
  • Python爬虫开发实战:Selenium自动化与浏览器控制全解析
  • YOLOv11改进 | DWRSeg扩张式残差助力小目标检测
  • web前端渡一大师课 02 浏览器渲染原理
  • Zara和网易云音乐仿写总结
  • Cortex-M内核的屏障指令
  • 并行编程实战——CUDA入门编程的函数