AOP 切入点表达式

  • AOP 概念:AOP

  • 切入点:要增强的方法

  • 切入点表达式: 要进行增强的方法的描述方式

一、切入点表达式的标准格式

动作关键词(访问修饰符 返回值 包名·类/接口名·方法名(参数) 异常名)

1
execution(public User cn.pangcy.service.UserService.findUserById(int))
  • 动作关键词:描述切入点的行为动作,例如 execution 标识执行到指定切入点
  • 访问修饰符:publicprivate 等,可以省略
  • 返回值
  • 包名
  • 类/接口名
  • 方法名
  • 参数
  • 异常名:方法定义中抛出指定异常,可以省略

二、切入点通配符

可以使用通配符描述切入点,快速描述

  • * : 单个独立的任意符号,可以独立出现,也可以作为前缀或后缀的匹配符出现
1
execution(public * cn.pangcy.*.UserService.find* (*))

匹配 cn.pangcy包下的任意包中的 UserService 类或接口中,所有 1 find 开头且带有一个参数的方法

  • .. : 多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
1
execution(public User cn..UserService.findById(..))

匹配 cn 包下的任意包中的 UserService 类或接口中所有形成为 findById 方法

  • + : 专用于匹配子类类型
1
execution(* *..*Service+.*(..))

三、书写技巧

  • 所有代码按照标准规范开发,否则一下技巧将会失效
  • 描述切入点通常描述接口,而不描述实现类
  • 访问控制修饰符针对接口开发均采用 public 描述(可省略访问控制修饰符描述
  • 返回值类型对于增删改查类使用精准类型加速匹配,对于查询类使用==* 通配==快速描述
  • 包名书写==尽量不使用 .. 匹配==, 效率过低,常用 * 做单个描述匹配,或精准匹配
  • 接口名/类名书写名称与模块相关的==采用 * 匹配==,例如 UserService 书写成 *Service,绑定业务层接口名
  • 方法名书写以动词进行精确匹配,名词采用 * 匹配,例如 getById 书写成 getBy*, selectAll 书写成 selectAll
  • 参数规则较为复杂,根据业务方法灵活调整
  • 通常不使用异常作为匹配规则

AOP 切入点表达式
https://blog.pangcy.cn/2023/04/10/后端编程相关/java/spring/AOP 切入点表达式/
作者
子洋
发布于
2023年4月10日
许可协议