跳至主要內容

Spring 源码学习-理解AOP实现思路

科哒大约 3 分钟

辅助理解图


一、Spring AOP的核心原理

  1. 基于动态代理
    • Spring AOP通过动态代理技术(JDK Proxy或CGLIB)在运行时生成代理对象,实现对目标方法的增强。
    • JDK Proxy:要求目标类实现接口,基于接口生成代理。
    • CGLIB:通过继承目标类生成子类代理(适用于未实现接口的类)。
  2. 与IOC容器协作
    • AOP代理的创建与Spring Bean的生命周期紧密结合,通过BeanPostProcessor(如AbstractAutoProxyCreator)在Bean初始化后生成代理对象。

二、AOP实现流程(基于图示)

1. 定义切面(Aspect)

  • 通过@Aspect注解或XML配置定义切面类。
  • 关键元素
    • 切入点(@Pointcut):定义需要拦截的方法(如execution(* com.example.service.*.*(..)))。
    • 通知(Advice):定义拦截逻辑(如@Before@Around)。

2. 代理对象的生成

  • 流程图核心步骤
    1. Bean初始化:Spring容器创建目标对象(Target Object)。
    2. 切面扫描:识别所有@Aspect类及定义的切入点。
    3. 匹配切入点:判断当前Bean的方法是否匹配切入点表达式。
    4. 生成代理
      • 若匹配,通过动态代理生成代理对象;
      • 代理对象包含目标对象和增强逻辑(Advice)。

3. 方法调用拦截

  • 代理对象执行流程
    1. 调用代理对象的方法时,触发拦截链(MethodInterceptor)。
    2. 按通知类型顺序执行增强逻辑(如前置通知→目标方法→后置通知)。
    3. 最终通过反射调用原始目标方法。

三、关键流程细节

  1. 对象的创建过程
    • 代理对象的生成发生在Bean初始化阶段,由AbstractAutoProxyCreator完成。
    • 代理对象会替换原始Bean实例,后续通过代理对象执行增强逻辑。
  2. 切面的应用
    • 动态织入:AOP逻辑在运行时动态织入,不影响编译期代码。
    • 责任链模式:多个通知按优先级组成拦截链,依次执行。
  3. 核心组件关联
    • Advisor:封装切入点(Pointcut)和通知(Advice)。
    • ProxyFactory:负责创建代理对象(选择JDK或CGLIB)。

四、流程总结

  1. 配置切面Bean初始化生成代理拦截方法调用执行增强逻辑
  2. 非侵入性:目标对象无需感知AOP逻辑,实现模块化横切关注点。
  3. 与IOC协同:依赖Spring容器管理代理对象的生命周期。

五、注意事项

  • 内部方法调用:同类内部方法调用(如this.method())不会触发AOP拦截(需通过代理对象调用)。
  • 性能权衡:动态代理会引入额外开销,高频调用场景需谨慎使用。
  • 配置方式:优先推荐注解(@Aspect)而非XML配置。

通过上述流程和原理,Spring AOP实现了对业务逻辑的解耦和增强,是Spring框架实现横切关注点(如日志、事务)的核心技术。

六、Spring源码中Aop创建代理对象前的准备工作