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

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.xdnf.cn/news/15744.html

相关文章:

  • Baumer工业相机堡盟工业相机如何通过YoloV8深度学习模型实现动物分类(C#源码,UI界面版)
  • 张 关于大语言模型(LLM)置信度研究的经典与前沿论文 :温度缩放;语义熵;自一致性;事实与反思;检索增强;黑盒引导;
  • 微服务学习(六)之分布式事务
  • 商业秘密的法律属性与保护路径探析
  • LeetCode 322. 零钱兑换 LeetCode 279.完全平方数 LeetCode 139.单词拆分 多重背包基础 56. 携带矿石资源
  • 【Docker基础】深入解析Docker-compose核心配置:Services服务配置详解
  • 【学习记录】智能客服小桃(进度更新ing)
  • Elastic Search 8.x 分片和常见性能优化
  • UniApp 自定义导航栏:解决安全区域适配问题的完整实践
  • 当OT遇见IT:Apache IoTDB如何用“时序空间一体化“破解工业物联网数据孤岛困局
  • 【黄山派-SF32LB52】—硬件原理图学习笔记
  • NLP中情感分析与观念分析、价值判断、意图识别的区别与联系,以及四者在实际应用中的协同
  • 疯狂星期四文案网第12天运营日报
  • 最少标记点问题:贪心算法解析
  • RabbitMQ面试精讲 Day 3:Exchange类型与路由策略详解
  • Astro:前端性能革命!从原生 HTML 到 Astro + React 的升级指南
  • Java机考题:815. 公交路线 图论BFS
  • 消息队列与信号量:System V 进程间通信的基础
  • P1816 忠诚 题解
  • Flutter基础(前端教程①④-data.map和assignAll和fromJson和toList)
  • 使用C#对象将WinRiver项目文件进行复杂的XML序列化和反序列化实例详解
  • 多模态交互视角下生成式人工智能在中小学探究式学习中的认知支架效能研究
  • 立创EDA中双层PCB叠层分析
  • 锂电池生产过程图解
  • 【OD机试】停车场收费
  • 暑假训练七
  • 【52】MFC入门到精通——(CComboBox)下拉框选项顺序与初始化不一致,默认显示项也不一致
  • Three.js与AIGC的化学反应:AI生成3D模型在实时渲染中的优化方案
  • Weavefox 图片 1 比 1 生成前端源代码
  • 基于Electron打包jar成Windows应用程序