Spring源码主线全链路拆解:从启动到关闭的完整生命周期
Spring源码主线全链路拆解:从启动到关闭的完整生命周期
一文看懂 Spring 框架从启动到销毁的主线流程,结合原理、源码路径与伪代码三位一体,系统学习 Spring 底层机制。
1. 启动入口与环境准备
原理说明
- Spring Boot 应用入口是标准 Java 应用
main()
方法。 - 核心在
SpringApplication.run()
,创建上下文并发布初始化事件。
核心调用链
SpringApplication.run()
→prepareEnvironment()
→ 发布ApplicationEnvironmentPreparedEvent
伪代码
public static void main(String[] args) {SpringApplication app = new SpringApplication(MainClass);app.run(args);
}SpringApplication.run():listeners = getRunListeners()listeners.starting()environment = prepareEnvironment()listeners.environmentPrepared(environment)
2. 资源加载与配置解析
原理说明
- 读取配置文件(
.properties
,.yml
) - 激活不同
Profile
,构建Environment
核心调用链
ConfigFileApplicationListener
监听器加载配置- 处理
PropertySource
、Profile
伪代码
prepareEnvironment():env = new StandardEnvironment()loadPropertySources(env)applyActiveProfiles(env)return env
3. BeanDefinition 加载与注册
原理说明
- 将类、配置文件中的 Bean 定义加载为
BeanDefinition
- 注册至
BeanFactory
核心调用链
AnnotationConfigApplicationContext.register()
注册启动类refresh()
中调用invokeBeanFactoryPostProcessors()
→ 加载并注册BeanDefinition
伪代码
createApplicationContext():context = new AnnotationConfigApplicationContext()context.register(MainClass)return contextrefresh():invokeBeanFactoryPostProcessors()registerBeanPostProcessors()scanAndRegisterBeanDefinitions()
4. BeanFactory 后处理器执行
原理说明
- 在
BeanFactory
初始化后、Bean 实例化前进行增强 - 用于修改或替换 BeanDefinition,如配置属性解析
核心调用链
invokeBeanFactoryPostProcessors()
遍历执行BeanFactoryPostProcessor
&BeanDefinitionRegistryPostProcessor
伪代码
invokeBeanFactoryPostProcessors(beanFactory):for processor in beanFactory.getPostProcessors():processor.postProcessBeanFactory(beanFactory)
5. Bean 实例化与依赖注入
原理说明
- 执行 Bean 实例创建与依赖注入
- 使用三级缓存解决循环依赖
核心调用链
getBean()
→doCreateBean()
→populateBean()
注入依赖
伪代码
getBean(name):if name in singletonObjects:return singletonObjects[name]if name in earlySingletonObjects:return earlySingletonObjects[name]if name in singletonFactories:instance = singletonFactories[name].getObject()earlySingletonObjects[name] = instancereturn instancebean = doCreateBean(name)singletonObjects[name] = beanreturn bean
6. Bean 初始化与增强
原理说明
- 通过
BeanPostProcessor
实现初始化增强 - 支持
@PostConstruct
,InitializingBean
,Aware
接口等回调机制
核心调用链
initializeBean()
→ 多种前后置处理器调用
伪代码
initializeBean(bean):bean = applyBeanPostProcessorsBeforeInitialization(bean)if bean instanceof Aware:bean.setXXX(...)if bean instanceof InitializingBean:bean.afterPropertiesSet()callPostConstruct(bean)bean = applyBeanPostProcessorsAfterInitialization(bean)return bean
7. AOP 代理织入
原理说明
- 动态代理目标 Bean,织入切面逻辑
- 支持 JDK 动态代理(接口)和 CGLIB(类继承)
核心调用链
AbstractAutoProxyCreator
实现BeanPostProcessor
wrapIfNecessary()
判断是否需要代理 → 创建代理
伪代码
if isAopProxyRequired(bean):proxy = createAopProxy(bean)return proxy
else:return beancreateAopProxy(bean):if bean implements interface:return JdkDynamicProxy(bean, advisors)else:return CglibProxy(bean, advisors)
8. 事件发布与监听
原理说明
- Spring 支持应用内事件发布/监听机制
- 可同步或异步触发事件处理逻辑
核心调用链
ApplicationEventPublisher.publishEvent()
→SimpleApplicationEventMulticaster.multicastEvent()
伪代码
publishEvent(event):for listener in multicaster.getListeners(event):if async:threadPool.submit(() -> listener.onEvent(event))else:listener.onEvent(event)
9. 事务声明与 AOP 增强
原理说明
- 使用
@Transactional
声明事务 - AOP 拦截器在方法执行前后控制事务边界
核心调用链
TransactionInterceptor.invoke()
→PlatformTransactionManager
开启/提交/回滚事务
伪代码
invoke(method, args):if method has @Transactional:beginTransaction()try:result = method.invoke(args)commitTransaction()return resultexcept Exception:rollbackTransaction()throwelse:return method.invoke(args)
10. 容器刷新与生命周期管理
原理说明
refresh()
负责初始化容器各组件destroy()
触发销毁逻辑、调用相关回调
核心调用链
AbstractApplicationContext.refresh()
→ 调用多个初始化方法close()
→ 发布关闭事件,销毁 Bean
伪代码
refresh():prepareBeanFactory()invokeBeanFactoryPostProcessors()registerBeanPostProcessors()initMessageSource()initApplicationEventMulticaster()onRefresh()registerListeners()finishBeanFactoryInitialization()publishEvent(ContextRefreshedEvent)destroy():for bean in disposableBeans:bean.destroy()
11. SPI 与自动扩展机制
原理说明
- 使用
spring.factories
加载接口实现类 - 实现组件解耦与自动集成(如自动装配)
核心调用链
SpringFactoriesLoader.loadFactoryNames()
加载所有扩展类SpringApplication
中调用自动装配逻辑
伪代码
loadSpringFactories(class):urls = getResources('META-INF/spring.factories')for url in urls:for entry in url:if entry.key == class.name:instances.add(newInstance(entry.value))return instances
12. 容器关闭与资源释放
原理说明
- Spring 注册 JVM 关闭钩子,确保资源释放
- 调用销毁方法、释放外部连接等资源
核心调用链
context.registerShutdownHook()
注册钩子close()
→ 销毁 Bean、发布关闭事件
伪代码
registerShutdownHook():Runtime.getRuntime().addShutdownHook(new Thread(() -> context.close()))close():publishEvent(ContextClosedEvent)destroyBeans()releaseResources()
🧠 总结:记忆口诀
启动 run 环境前,listeners 事件先上演;
配置加载属性合,Profiles 激活不能漏;
Bean 定义工厂后,三层缓存破死锁;
初始化加增强,Aware 构造都上场;
AOP 切面织代理,JDK CGLIB 二选一;
事件机制多线程,监听发布全响应;
事务增强控边界,异常回滚不出界;
刷新容器搞初始化,销毁钩子稳收场;
SPI 自动扩展巧,factories 加持少不了;
优雅关机释放清,Spring 框架全打通。
如需进一步深入某一模块的 源码行级分析(如 BeanFactory 的三级缓存实现细节、事务拦截器如何处理回滚),欢迎留言指定模块!我可以继续细拆每个关键类与方法逻辑。