Spring AOP 是如何生效的(入口源码级解析)?

文章目录

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 时,都会经过以下判断流程:

三个核心判断条件:

  1. 非基础设施类:排除AOP自身的组件
  2. 不应跳过:通过shouldSkip()自定义过滤
  3. 存在匹配Advisor:当前Bean有适用的切面逻辑

六、总结:入口生效的三大核心步骤

  1. 组件注册阶段
    通过 @EnableAspectJAutoProxy<aop:aspectj-autoproxy/> 触发注册

    向容器注册 AnnotationAwareAspectJAutoProxyCreator(固定名称:internalAutoProxyCreator
  2. 处理器激活阶段
    refresh()registerBeanPostProcessors() 阶段

    实例化代理创建器并加入BeanPostProcessor队列
  3. Bean初始化拦截阶段
    对所有Bean执行 postProcessAfterInitialization()

    通过 wrapIfNecessary() 三步判断决定是否创建代理

关键结论 :Spring AOP的生效入口本质是向容器注册了一个特殊的BeanPostProcessor,它通过拦截Bean初始化过程,在运行时动态创建代理对象,从而实现对目标方法的切面增强。


扩展

AnnotationAwareAspectJAutoProxyCreator Diagrams


End!

相关推荐
Moonbit13 分钟前
招募进行时 | MoonBit AI : 程序语言 & 大模型
前端·后端·面试
LiuYaoheng14 分钟前
【Android】Drawable 基础
android·java
AlianNiew16 分钟前
从源码到实战:用 Java 打造“限时+防重放”的文件安全预览链接
java·后端
null or notnull1 小时前
java服务器空间不够时:将多个服务器的文件存放至同一个服务器上(使用映射器的办法)
java·运维·服务器·java-ee
小威要向诸佬学习呀1 小时前
2025年软件外包避坑指南与平台推荐:开发者实用经验分享
后端
冒泡的肥皂1 小时前
2PL+MVCC看一些场景
数据库·后端·mysql
bcbnb1 小时前
Charles 抓不到包怎么办?一线工程师的排查与真机抓包流程
后端
代码栈上的思考1 小时前
JVM中内存管理的策略
java·jvm
bcbnb1 小时前
IPA 一键加密工具实战,用多工具组合把加固做成一次性与可复用的交付能力(IPA 一键加密/Ipa Guard CLI/成品加固)
后端
YoungP1 小时前
【Effective Java 条目二】-- 当构造器参数较多时考虑使用生成器
java