Spring AOP 是如何生效的(入口源码级解析)?
文章目录
- 一、核心入口:注册自动代理创建器
- 1. 注解驱动入口
- 2. XML驱动入口
- 二、核心注册方法解析
- AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary();
- AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary()
- 三、核心组件:AnnotationAwareAspectJAutoProxyCreator
- 1. 主要类继承关系
- 2. 核心方法实现
- 四、首次触发时机:容器刷新过程
- 五、代理创建的触发条件
- 三个核心判断条件:
- 六、总结:入口生效的三大核心步骤
- 扩展
- AnnotationAwareAspectJAutoProxyCreator Diagrams
Spring AOP 的生效始于容器启动阶段的核心组件注册过程,这是整个 AOP 机制的关键入口。下面重点解析这个启动过程的核心步骤:
在使用Spring AOP的时候总会有以下两种方式(基于xml或基于注解)的任一配置来达到启用 Spring AOP 功能的目的
- 基于xml:
<aop:aspectj-autoproxy/>
- 基于注解:
@EnableAspectJAutoProxy
在源码阅读是可以直接在Spring项目中搜索目标配置就能找到具体解析方法了;如下:
一、核心入口:注册自动代理创建器
1. 注解驱动入口
当使用 @EnableAspectJAutoProxy
时,触发以下注册链:
入口类:org.springframework.context.annotation.AspectJAutoProxyRegistrar
2. XML驱动入口
当解析 <aop:aspectj-autoproxy/>
标签时:
spring-aop 模块中的处理器映射:META-INF/spring.handlers
入口类:org.springframework.aop.config.AspectJAutoProxyBeanDefinitionParser
二、核心注册方法解析
AopNamespaceUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary();
提示: XML的配置方式实际也是调用到注解的驱动入口方法。
注册BeanDefinition
:org.springframework.aop.config.AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary()
的这里不再赘述,看后面的详解。
看XML标签的后续解析方法:org.springframework.aop.config.AopNamespaceUtils.useClassProxyingIfNecessary
解析关键配置属性:<aop:aspectj-autoproxy proxy-target-class="true", expose-proxy="true"/>
forceAutoProxyCreatorToUseClassProxying
:代理类型选择(proxy-target-class)forceAutoProxyCreatorToExposeProxy
:暴露代理(expose-proxy)
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary()
三、核心组件:AnnotationAwareAspectJAutoProxyCreator
1. 主要类继承关系
2. 核心方法实现
BeanPostProcessor
接口实现
四、首次触发时机:容器刷新过程
在 AbstractApplicationContext.refresh()
中,代理创建器在特定阶段被激活:
关键点:在 registerBeanPostProcessors()
阶段,AnnotationAwareAspectJAutoProxyCreator
作为 BeanPostProcessor
被实例化并注册到容器中,准备拦截后续所有 Bean 的初始化过程。
五、代理创建的触发条件
当 Spring 容器初始化任何 Bean 时,都会经过以下判断流程:
三个核心判断条件:
- 非基础设施类:排除AOP自身的组件
- 不应跳过:通过shouldSkip()自定义过滤
- 存在匹配Advisor:当前Bean有适用的切面逻辑
六、总结:入口生效的三大核心步骤
- 组件注册阶段
通过@EnableAspectJAutoProxy
或<aop:aspectj-autoproxy/>
触发注册
↓
向容器注册AnnotationAwareAspectJAutoProxyCreator
(固定名称:internalAutoProxyCreator
) - 处理器激活阶段
在refresh()
的registerBeanPostProcessors()
阶段
↓
实例化代理创建器并加入BeanPostProcessor
队列 - Bean初始化拦截阶段
对所有Bean执行postProcessAfterInitialization()
↓
通过wrapIfNecessary()
三步判断决定是否创建代理
关键结论:Spring AOP的生效入口本质是向容器注册了一个特殊的
BeanPostProcessor
,它通过拦截Bean初始化过程,在运行时动态创建代理对象,从而实现对目标方法的切面增强。
扩展
AnnotationAwareAspectJAutoProxyCreator Diagrams
End!