Spring_AOP

AOP (Aspect Oriented Programming) 面向切面编程

实质是面向特定方法编程

实现

动态代理是面向切面编程最主流的实现。而SpringAOP 是spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。

aop应用场景:

  • 记录操作日志

  • 权限控制

  • 事务管理

aop优势:

  • 代码无侵入
  • 减少重复代码
  • 提高开发效率
  • 维护方便

Aop 核心概念

alt text

AOP 执行流程:
将目标对象 封装成一个新的 代理对象,最后依赖注入的是代理对象。

通知类型

alt text

tips

  • @Around 环绕通知 需要自己调用 joinPoint.proceed() 来让原始方法执行,其他的通知类型不需要考虑

  • @Around 环绕通知的方法 返回值必须指定Object,来接受原始方法的返回值。

通知顺序

当有多个切面中的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行。
其执行顺序如下:

  1. 默认按照类名字典序排序

  2. 可以使用@Order(数字) 注解来指定顺序

  • 目标方法前的通知方法:字母靠前 / 数字小的 先执行
  • 目标方法后的通知方法:字母靠前 / 数字小的 后执行

切入点表达式

主要用来决定项目中的哪些方法需要加入通知

常见形式:

  • execution(…): 根据方法签名匹配
  • @annotation(…): 根据注解匹配

execution

execution 是通知类型中的一个属性

alt text

tips:

  • 异常指的是需要加入通知的方法的声明中是否有抛出异常

切入点表达式中通配符 * 以及 .. 的使用规则
两个符号主要区别: *主要是通配单个 ; 而 .. 是可以通配多个参数、返回值、包名、类名等
alt text

书写建议
alt text

根据业务需要,可以使用(&&)、(||)、(!)来组合比较复杂的切入点表达式

@annotation

@annotation 也是通知类型中的一个属性

用于匹配标识有特定注解的方法
@annotation(注解全类名)

@PointCut

该注解是为了 抽取出公共的切入点表达式。进行引用时调用即可
alt text

连接点

连接点代指需要加入到通知中去的方法
在Spring中用JoinPoint 抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等

  • 对于@Around 通知,获取连接点信息 只能使用 ProceedingJoinPoint
  • 对于其他四种通知,获取连接点信息 只能使用 JoinPoint ,它是ProceedingJoinPoint的父类型

alt text


Spring_AOP
https://cs-lb.github.io/2024/10/29/Java/Spring-AOP/
作者
Liu Bo
发布于
2024年10月29日
许可协议