当前位置: 首页 > news >正文

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 监听器加载配置
  • 处理 PropertySourceProfile

伪代码

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 的三级缓存实现细节、事务拦截器如何处理回滚),欢迎留言指定模块!我可以继续细拆每个关键类与方法逻辑。

相关文章:

  • 微服务项目->在线oj系统(Java版 - 1)
  • Vue-计算属性
  • 【QGIS二次开发】地图编辑-09
  • 1-机器学习的基本概念
  • 网络流算法
  • 进程与线程:10 信号量临界区保护
  • 【通用智能体】Serper API 详解:搜索引擎数据获取的核心工具
  • Redis 学习笔记 4:优惠券秒杀
  • GEE谷歌地球引擎批量下载逐日ERA5气象数据的方法
  • 《P4551 最长异或路径》
  • C语言之旅【6】--一维数组和二维数组
  • MyBatis(二)
  • AI Agent开发第70课-彻底消除RAG知识库幻觉(4)-解决知识库问答时语料“总重复”问题
  • 生成树的保护机制
  • 解决 Tailwind CSS 代码冗余问题
  • 功能安全管理
  • ES(ES2023/ES14)最新更新内容,及如何减少内耗
  • 《C++与OpenCV实战:图像增强大核心算法详解》​​
  • 设备预测性维护:从技术架构到工程实践,中讯烛龙如何实现停机时间锐减
  • 玄机-第二章日志分析-redis应急响应
  • 证监会副主席李明:支持符合条件的外资机构申请新业务、设立新产品
  • 释新闻|拜登确诊恶性前列腺癌,预后情况如何?
  • 上海明天短暂恢复晴热最高32℃,一大波雨水在候场
  • 聚焦中华文明精神标识,多校专家学者跨学科对话交流
  • 天问二号探测器顺利转入发射区,计划5月底择机发射
  • 外交部驻港公署正告美政客:威胁恫吓撼动不了中方维护国家安全的决心