掘金小册《从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
方法中将目标对象包装为代理对象。这里面涉及到几个核心步骤:
- 检查当前初始化的 bean 是否可以被 AOP 代理(检查是否有匹配的增强器)
- 如果存在,则根据当前初始化的 bean 所属类有无实现接口,以及 AOP 的全局配置,决定使用哪种代理方案
- 将目标对象包装为
TargetSource
,并以此为原型生成代理对象
5.1 代理对象的通知逻辑是如何执行的
代理对象被构造后,执行方法会进入 JdkDynamicAopProxy / CglibAopProxy
中,并构造 ReflectiveMethodInvocation
并依次执行这些织入的通知。执行通知的逻辑是靠一个 currentInterceptorIndex
下标控制,并以此下标为依据顺序执行增强器的通知逻辑。
加油儿!!!