Spring AOP 注解开启全流程源码解析:从 <aop:aspectj-autoproxy/> 到代理生成
Spring AOP 注解功能(如 @Aspect、@Before)的开启依赖 <aop:aspectj-autoproxy/> 配置,其底层是一套 “自定义标签解析→核心处理器注册→BeanPostProcessor 介入→AOP 代理生成” 的完整链路。从 “自定义标签解析”“核心处理器初始化”“BeanPostProcessor 调用时机”“AOP 代理生成” 四个维度,逐行拆解 AOP 注解开启的底层逻辑。
前置知识:Spring 自定义标签解析机制
<aop:aspectj-autoproxy/> 并非 Spring 内置的 “默认标签”(如 <bean>、<import>),而是自定义标签。Spring 解析自定义标签需依赖两个核心配置文件和一套解析流程:
自定义标签的核心配置文件
Spring 通过类路径下的 META-INF/spring.handlers 和 META-INF/spring.schemas 关联自定义标签与解析逻辑:
spring.handlers:映射 “命名空间(namespace)” 到 “标签处理器(NamespaceHandler)”,告诉 Spring 用哪个类解析该命名空间下的标签;spring.schemas:映射 “XSD Schema 地址” 到 “本地 XSD 文件”,用于校验自定义标签的语法合法性。
示例:AOP 自定义标签的配置
1 | # spring.handlers:aop 命名空间对应 AopNamespaceHandler |
自定义标签的解析流程
当 Spring 解析 XML 配置遇到自定义标签(如 <aop:aspectj-autoproxy/>)时,执行以下步骤:
- 提取命名空间:从标签的
xmlns:aop属性获取命名空间(http://www.springframework.org/schema/aop); - 获取处理器:通过
NamespaceHandlerResolver从spring.handlers中找到对应的AopNamespaceHandler; - 初始化处理器:调用
AopNamespaceHandler.init()注册标签解析器; - 解析标签:根据标签名称(
aspectj-autoproxy)调用对应的解析器(AspectJAutoProxyBeanDefinitionParser)。