Spring 源码学习-理解AOP实现思路
大约 3 分钟
辅助理解图

一、Spring AOP的核心原理
- 基于动态代理
- Spring AOP通过动态代理技术(JDK Proxy或CGLIB)在运行时生成代理对象,实现对目标方法的增强。
- JDK Proxy:要求目标类实现接口,基于接口生成代理。
- CGLIB:通过继承目标类生成子类代理(适用于未实现接口的类)。
- 与IOC容器协作
- AOP代理的创建与Spring Bean的生命周期紧密结合,通过
BeanPostProcessor
(如AbstractAutoProxyCreator
)在Bean初始化后生成代理对象。
- AOP代理的创建与Spring Bean的生命周期紧密结合,通过
二、AOP实现流程(基于图示)
1. 定义切面(Aspect)
- 通过
@Aspect
注解或XML配置定义切面类。 - 关键元素:
- 切入点(
@Pointcut
):定义需要拦截的方法(如execution(* com.example.service.*.*(..))
)。 - 通知(Advice):定义拦截逻辑(如
@Before
、@Around
)。
- 切入点(
2. 代理对象的生成
- 流程图核心步骤:
- Bean初始化:Spring容器创建目标对象(Target Object)。
- 切面扫描:识别所有
@Aspect
类及定义的切入点。 - 匹配切入点:判断当前Bean的方法是否匹配切入点表达式。
- 生成代理:
- 若匹配,通过动态代理生成代理对象;
- 代理对象包含目标对象和增强逻辑(Advice)。
3. 方法调用拦截
- 代理对象执行流程:
- 调用代理对象的方法时,触发拦截链(
MethodInterceptor
)。 - 按通知类型顺序执行增强逻辑(如前置通知→目标方法→后置通知)。
- 最终通过反射调用原始目标方法。
- 调用代理对象的方法时,触发拦截链(
三、关键流程细节
- 对象的创建过程
- 代理对象的生成发生在Bean初始化阶段,由
AbstractAutoProxyCreator
完成。 - 代理对象会替换原始Bean实例,后续通过代理对象执行增强逻辑。
- 代理对象的生成发生在Bean初始化阶段,由
- 切面的应用
- 动态织入:AOP逻辑在运行时动态织入,不影响编译期代码。
- 责任链模式:多个通知按优先级组成拦截链,依次执行。
- 核心组件关联
- Advisor:封装切入点(Pointcut)和通知(Advice)。
- ProxyFactory:负责创建代理对象(选择JDK或CGLIB)。
四、流程总结
- 配置切面 → Bean初始化 → 生成代理 → 拦截方法调用 → 执行增强逻辑。
- 非侵入性:目标对象无需感知AOP逻辑,实现模块化横切关注点。
- 与IOC协同:依赖Spring容器管理代理对象的生命周期。
五、注意事项
- 内部方法调用:同类内部方法调用(如
this.method()
)不会触发AOP拦截(需通过代理对象调用)。 - 性能权衡:动态代理会引入额外开销,高频调用场景需谨慎使用。
- 配置方式:优先推荐注解(
@Aspect
)而非XML配置。
通过上述流程和原理,Spring AOP实现了对业务逻辑的解耦和增强,是Spring框架实现横切关注点(如日志、事务)的核心技术。
六、Spring源码中Aop创建代理对象前的准备工作
