Spring AOP 详细笔记(含核心思想及Advisor相关概念)
0. AOP 核心思想
-
在不修改源代码的情况下,通过动态代理实现方法增强。
-
将系统中与业务无关的“横切关注点”(如日志、事务、安全等)模块化,统一管理和复用。
-
通过“切面”(Aspect)将增强逻辑从业务逻辑中分离,实现关注点分离(Separation of Concerns)。
1. AOP 核心概念
名称 | 说明 |
---|---|
Aspect(切面) | 增强逻辑的模块,封装了通知和切点的集合 |
Advice(通知) | 切面中具体的增强动作,比如前置通知、后置通知、环绕通知等 |
Join Point(连接点) | 程序执行过程中的某个点(通常是方法调用点) |
Pointcut(切点) | 匹配 Join Point 的表达式,定义在哪些连接点应用通知 |
Advisor(通知者) | Advice 和 Pointcut 的组合,Spring AOP中用Advisor统一管理通知和切点 |
Target Object(目标对象) | 被代理的对象,包含业务逻辑的原始对象 |
Proxy Object(代理对象) | 代理后的对象,增强了通知逻辑,替代目标对象注入容器 |
2. AOP 代理机制
-
Spring 通过 动态代理(JDK动态代理或CGLIB)生成代理对象。
-
代理对象实现接口或继承目标类,拦截方法调用。
-
调用代理对象方法时,通知链被执行,Advice 在方法前后插入增强逻辑。
3. Advisor 及 Advice 相关
3.1 Advice 类型
-
Before Advice:方法调用前执行。
-
After Returning Advice:方法正常返回后执行。
-
After Throwing Advice:方法抛异常后执行。
-
After (finally) Advice:方法执行结束后执行(无论正常或异常)。
-
Around Advice:包围通知,可在方法调用前后自定义逻辑,有权决定是否执行目标方法。
3.2 Pointcut
-
定义哪些方法是切入点。
-
使用表达式语言(如 AspectJ 表达式)匹配类和方法。
3.3 Advisor
-
是 Advice 和 Pointcut 的组合体。
-
Spring AOP 用 Advisor 统一管理切面中的通知逻辑和切点信息。
-
一个切面可以包含多个 Advisor。
4. AOP 接入机制(BeanPostProcessor)
-
AnnotationAwareAspectJAutoProxyCreator
实现了BeanPostProcessor
。 -
在
postProcessAfterInitialization()
:-
判断 Bean 是否匹配 Advisor 中的 Pointcut。
-
匹配则为 Bean 创建代理对象(JDK 或 CGLIB)。
-
-
容器中注入的代理对象包含通知逻辑。
5. 动态代理实现(详细)
方式 | 实现原理 | 适用场景 | 优缺点 |
---|---|---|---|
JDK 动态代理 | 实现目标接口,通过 InvocationHandler 代理方法调用 | 目标类实现接口,接口明确 | 简单高效,接口限制,不能代理新增方法 |
CGLIB 代理 | 继承目标类,重写方法,通过 MethodInterceptor 代理 | 目标类无接口或需要代理所有方法 | 支持无接口类,不能代理 final 方法,生成开销较大 |
-
Spring 默认优先使用 JDK 动态代理,目标类无接口时用 CGLIB。
6. AOP 执行流程总结
1. Spring容器创建Bean
2. BeanPostProcessor.postProcessAfterInitialization判断是否需要代理
3. 查找所有Advisor,匹配Pointcut
4. 若匹配,生成代理对象(JDK或CGLIB)
5. 代理对象替代原始Bean注入容器
6. 调用代理对象方法
7. 代理对象执行Advisor中Advice链
8. Advice执行前后增强逻辑(Before, Around, After等)
9. 最终调用目标对象方法
10. 返回结果
7. 相关要点
-
Advisor是Spring AOP的关键封装,统一管理通知和切点。
-
Advice具体执行增强逻辑,Pointcut定义增强范围。
-
代理对象透明替代目标对象,业务代码无感知。
-
三级缓存机制支持循环依赖与早期代理引用。
-
注意:CGLIB不能代理
final
方法,JDK代理只能代理接口方法。