Spring_AOP
AOP (Aspect Oriented Programming) 面向切面编程
实质是面向特定方法编程
实现
动态代理是面向切面编程最主流的实现。而SpringAOP 是spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。
aop应用场景:
记录操作日志
权限控制
事务管理
aop优势:
- 代码无侵入
- 减少重复代码
- 提高开发效率
- 维护方便
Aop 核心概念
AOP 执行流程:
将目标对象 封装成一个新的 代理对象,最后依赖注入的是代理对象。
通知类型
tips
@Around 环绕通知 需要自己调用
joinPoint.proceed()
来让原始方法执行,其他的通知类型不需要考虑@Around 环绕通知的方法
返回值必须指定Object
,来接受原始方法的返回值。
通知顺序
当有多个切面中的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行。
其执行顺序如下:
默认按照类名字典序排序
可以使用@Order(数字) 注解来指定顺序
- 目标方法前的通知方法:字母靠前 / 数字小的 先执行
- 目标方法后的通知方法:字母靠前 / 数字小的 后执行
切入点表达式
主要用来决定项目中的哪些方法需要加入通知
常见形式:
- execution(…): 根据方法签名匹配
- @annotation(…): 根据注解匹配
execution
execution 是通知类型中的一个属性
tips:
- 异常指的是需要加入通知的方法的声明中是否有抛出异常
切入点表达式中通配符 *
以及 ..
的使用规则
两个符号主要区别: *
主要是通配单个 ; 而 ..
是可以通配多个参数、返回值、包名、类名等
书写建议
根据业务需要,可以使用(&&)、(||)、(!)来组合比较复杂的切入点表达式
@annotation
@annotation 也是通知类型中的一个属性
用于匹配标识有特定注解的方法@annotation(注解全类名)
@PointCut
该注解是为了 抽取出公共的切入点表达式。进行引用时调用即可
连接点
连接点代指需要加入到通知中去的方法
在Spring中用JoinPoint 抽象了连接点,用它可以获得方法执行时的相关信息,如目标类名、方法名、方法参数等
- 对于@Around 通知,获取连接点信息 只能使用 ProceedingJoinPoint
- 对于其他四种通知,获取连接点信息 只能使用 JoinPoint ,它是ProceedingJoinPoint的父类型
Spring_AOP
https://cs-lb.github.io/2024/10/29/Java/Spring-AOP/