Spring知识点儿复习AOP

掘金小册《从0开始学习Spring》


1. AOP概述

AOP面向切面编程,在不修改业务代码的前提下,使用运行时动态代理,对已有的逻辑进行功能扩展

  • AOP的底层设计是由运行时动态代理支撑,在bean的初始化流程中,借助BeanPostProcessor将目标对象织入通知,生成代理对象

2. AOP术语

  • Target 目标对象:被代理的原始对象
  • Proxy 代理对象:目标对象被织入通知后的产物就是代理对象
  • JoinPoint 连接点:目标对象的所属类中,定义的所有方法均为连接点
  • Pointcut 切入点:被切面拦截 / 增强的连接点(切入点一定是连接点,连接点不一定是切入点)
  • Advice 通知:增强的逻辑 / 代码,也即拦截到目标对象的连接点之后要做的事情
  • Aspect 切面:切入点 + 通知
  • Weaving 织入:将通知应用到目标对象,进而生成代理对象的过程动作

3. AspectJ定义的通知类型

  • Before 前置通知:目标对象的方法调用之前触发
  • After 后置通知:目标对象的方法调用之后触发
  • AfterReturning 返回通知:目标对象的方法调用完成,在返回结果值之后触发
  • AfterThrowing 异常通知:目标对象的方法运行中抛出 / 触发异常后触发
  • Around 环绕通知:编程式控制目标对象的方法调用。环绕通知是所有通知类型中可操作范围最大的一种,因为它可以直接拿到目标对象,以及要执行的方法,所以环绕通知可以任意的在目标对象的方法调用前后搞事,甚至不调用目标对象的方法

4. AOP的使用场景

  • 业务日志切面:可以记录业务方法调用的痕迹
  • 事务控制:通过切面可以声明式控制事务
  • 权限校验:执行方法之前先校验当前登录用户是否有权调用
  • 数据缓存:执行方法之前先从缓存中取,取到则直接返回不走业务方法

5. AOP的底层原理机制

AOP 在底层,借助 AnnotationAwareAspectJAutoProxyCreator 在 bean 的初始化流程,postProcessAfterInitialization 方法中将目标对象包装为代理对象。这里面涉及到几个核心步骤:

  1. 检查当前初始化的 bean 是否可以被 AOP 代理(检查是否有匹配的增强器)
  2. 如果存在,则根据当前初始化的 bean 所属类有无实现接口,以及 AOP 的全局配置,决定使用哪种代理方案
  3. 将目标对象包装为 TargetSource ,并以此为原型生成代理对象

5.1 代理对象的通知逻辑是如何执行的

代理对象被构造后,执行方法会进入 JdkDynamicAopProxy / CglibAopProxy 中,并构造 ReflectiveMethodInvocation 并依次执行这些织入的通知。执行通知的逻辑是靠一个 currentInterceptorIndex 下标控制,并以此下标为依据顺序执行增强器的通知逻辑。


加油儿!!!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

方圆想当图灵

嘿嘿,小赏就行,不赏俺也不争你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值