夜雨聆风学习资料网

ARTICLE · 1336680

第 31 章 Spring 源码阅读路线实战:Bean 生命周期与 IoC 容器、AOP 代理与事务拦截器、自动装配条件注解与落地实施路径

第 31 章 Spring 源码阅读路线实战:Bean 生命周期与 IoC 容器、AOP 代理与事务拦截器、自动装配条件注解与落地实施路径

读 Spring 源码的目的不是背类名,而是理解框架如何管理 Bean、启动上下文、处理请求、实现事务代理和自动装配。源码浩大,必须从问题进入,沿着一次请求或一次启动流程走。

01

PART

准备源码

PART 01

获取源码:

...bash

git clone https://github.com/spring-projects/spring-framework.git

git clone https://github.com/spring-projects/spring-boot.git

建议选择与项目相同的 release 分支。日常开发不必自己编译整个 Spring,可直接下载 source jar 或在 IDE 中自动关联源码。

Maven 下载源码:

...bash

mvn dependency:sources

02

PART

模块地图

PART 02

...text

spring-core

  |-- core

  |-- beans

  |-- context

  |-- aop

  |-- tx

  |-- web

  +-- webmvc

spring-boot

  |-- spring-boot

  |-- spring-boot-autoconfigure

  |-- spring-boot-actuator

  +-- starters

模块
重点
spring-beans
BeanDefinition、BeanFactory、生命周期
spring-context
事件、扩展点、refresh
spring-aop
代理、切点、Advisor
spring-tx
事务拦截器和传播行为
spring-webmvc
DispatcherServlet 请求链
spring-boot
SpringApplication 启动流程
autoconfigure
条件装配和 Starter

03

PART

IoC 阅读路线

PART 03

入口:

...java

SpringApplication.run(OrderApplication.class, args);

推荐路线:

...text

SpringApplication.run

  -> createApplicationContext

  -> refreshContext

  -> AbstractApplicationContext.refresh

  -> invokeBeanFactoryPostProcessors

     -> ConfigurationClassPostProcessor

  -> finishBeanFactoryInitialization

  -> DefaultListableBeanFactory.preInstantiateSingletons

  -> AbstractBeanFactory.doGetBean

  -> AbstractAutowireCapableBeanFactory.createBean

重点问题:

1

BeanDefinition 从哪里来;

2

BeanPostProcessor 何时注册;

3

单例缓存如何工作;

4

依赖注入如何解析候选者;

5

Bean 生命周期回调顺序。

04

PART

Bean 生命周期阅读

PART 04

核心方法:

...text

AbstractAutowireCapableBeanFactory.createBean

  -> createBeanInstance

  -> populateBean

  -> initializeBean

     -> invokeAwareMethods

     -> applyBeanPostProcessorsBeforeInitialization

     -> invokeInitMethods

     -> applyBeanPostProcessorsAfterInitialization

断点建议:

1

createBeanInstance:观察构造器选择;

2

populateBean:观察依赖注入;

3

initializeBean:观察初始化回调;

4

postProcessAfterInitialization:观察 AOP 代理;

5

destroySingleton:观察销毁流程。

调试时可以在自定义 Bean 的构造器、@PostConstruct、@PreDestroy 打日志,把源码顺序和业务观察对应起来。

05

PART

AOP 阅读路线

PART 05

入口:

...java

@EnableAspectJAutoProxy

路线:

...text

AnnotationAwareAspectJAutoProxyCreator

  -> findCandidateAdvisors

  -> buildAspectJAdvisors

  -> shouldSkip / findEligibleAdvisors

  -> createProxy

     -> JdkDynamicAopProxy

     -> ObjenesissCglibAopProxy

  -> DynamicAdvisedInterceptor.intercept

  -> ReflectiveMethodInvocation.proceed

重点问题:

1

Aspect 注解如何解析成 Advisor;

2

代理何时生成;

3

Advice 执行链如何组织;

4

为什么自调用失效;

5

@Transactional 如何复用 AOP。

06

PART

事务源码

PART 06

入口:

...java

@EnableTransactionManagement

路线:

...text

TransactionAutoConfiguration

  -> ProxyTransactionManagementConfiguration

  -> TransactionInterceptor

  -> TransactionAspectSupport.invokeWithinTransaction

  -> PlatformTransactionManager.getTransaction

  -> DataSourceTransactionManager.doBegin

  -> commit / rollback

重点看:

1

事务属性解析;

2

传播行为处理;

3

rollbackFor 匹配;

4

连接绑定 ThreadLocal;

5

savepoint 创建;

6

挂起和恢复事务。

07

PART

Spring MVC 源码

PART 07

一次请求:

...text

DispatcherServlet.doService

  -> doDispatch

  -> HandlerMapping.getHandler

  -> HandlerAdapter.handle

  -> RequestMappingHandlerAdapter.invokeHandlerMethod

  -> InvocableHandlerMethod.invokeForRequest

  -> HandlerMethodReturnValueHandler

  -> HttpMessageConverter

重点问题:

1

URL 如何映射到 HandlerMethod;

2

参数如何解析;

3

校验何时触发;

4

异常如何进入 HandlerExceptionResolver;

5

返回值如何序列化;

6

Filter、Interceptor、ControllerAdvice 的顺序。

08

PART

Spring Boot 自动装配源码

PART 08

入口:

...java

@EnableAutoConfiguration

路线:

...text

AutoConfigurationImportSelector

  -> getAutoConfigurationEntry

  -> ImportAutoConfigurationImportSelector

  -> AutoConfigurationSorter

  -> ConditionEvaluator

  -> OnClassCondition / OnBeanCondition / OnPropertyCondition

Spring Boot 3 中自动配置类从 AutoConfiguration.imports 读取;旧版本从 spring.factories 读取。

重点问题:

1

候选配置如何过滤;

2

条件报告如何生成;

3

配置顺序如何排序;

4

用户 Bean 如何覆盖默认 Bean。

09

PART

高效调试技巧

PART 09

条件断点:

...text

beanName.equals("orderService")

method.getName().equals("createOrder")

request.getRequestURI().equals("/api/orders")

辅助 Bean:

...java

@Component

publicclassLifecycleDebugBean {

@PostConstruct

publicvoidafterProperties() {

        System.out.println("order service initialized");

    }

@PreDestroy

publicvoidbeforeDestroy() {

        System.out.println("order service destroyed");

    }

}

观察 Bean:

...java

applicationContext.getBeansOfType(Object.class).size();

applicationContext.getBeanDefinitionNames();

建议新建最小工程,只保留被研究的问题,避免业务代码干扰。

10

PART

阅读方法

PART 10

推荐流程:

...text

1. 提出一个具体问题

2. 从入口断点确认调用链

3. 画出时序图

4. 标记关键扩展点

5. 写一个最小复现实验

6. 对比不同版本

7. 记录结论和边界

不要试图从第一个类线性读完所有源码。Spring 的价值在主流程和扩展模型,理解这两层后,其余代码会更容易定位。

///

LAST

本章小结

SUMMARY · 本章小结

Spring 源码阅读应从启动、Bean 生命周期、AOP、事务、MVC 和自动装配六条主线进入。先通过断点和日志观察行为,再阅读实现,把调用链画成图,并用最小实验验证理解。版本差异是源码学习中必须持续关注的边界。

思考题

1

refresh() 中哪些阶段最重要?

2

AOP 代理是在哪个生命周期阶段生成的?

3

@Transactional 的核心入口是哪个类?

4

一次 REST 请求经过哪些核心组件?

5

如何验证自动配置条件为什么不匹配?

Spring 源码阅读应从启动、Bean 生命周期、AOP、事务、MVC 和自动装配六条主线进入。

回首页,搜索你想要的文档

在首页搜索框输入关键词,快速定位资料

文库首页搜索指引 立即搜索

相关学习资料