news 2026/10/14 17:04:06

SpringApplication启动流程源码解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SpringApplication启动流程源码解析
  1. 从main方法的SpringApplication.run()开始,这里是使用类名调用静态方法,这是启动的入口

  2. contrl+b进入源码,看到这个run方法,在这里面这个静态run方法的实现分为两步骤,第一先初始化实例SpringApplication,然后再调用SpringApplication的run方法

2.1 在new SpringApplication中,是通过构造函数进行初始化

在这里SpringBoot会推断web应用类型,是reactive/servlet/none

this.properties.setWebApplicationType(WebApplicationType.deduce());

之后加载 Initializers 和 Listeners: Spring Boot 会从META-INF/spring.factories(在 Spring Boot 3.x 中,主要迁移到了META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,但spring.factories依然为了兼容性而存在)文件中,加载ApplicationContextInitializer和ApplicationListener接口的实现类

this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class)); this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));

2.2 run方法核心步骤讲解

  • Startup机制计时

在SpringBoot2.3及以前,run方法一开始就启动StopWatch来计时,但是现在使用了Startup机制来计时,为什么换了,原因如下?

StopWatch太简单了,只能记录“总耗时”。而在 Spring Boot 3.x 中,开发者需要更细粒度的监控(比如:Environment 准备花了多久?Bean 初始化花了多久?Tomcat 启动花了多久?)。Startup机制引入了一个名为ApplicationStartup的接口,它支持记录启动过程中的每一个步骤(Step),功能比StopWatch强大得多

  • Evironment准备:

prepareEnvironment()方法在容器创建之前执行,负责创建Environment并加载所有配置源。加载顺序(优先级从低到高,后加载的覆盖先加载的)如下:

  1. application.yml/application.properties:最低优先级。

  2. 操作系统环境变量:高于配置文件。

  3. JVM 系统属性(-D参数):高于环境变量。

  4. 命令行参数(--server.port=9090):最高优先级

  • 创建 ApplicationContext:根据 Web 类型选择

Spring Boot 会根据之前在new Application中推断的WebApplicationType,在createApplicationContext()方法中创建对应的容器。

Web 应用类型创建的 ApplicationContext 实现
SERVLETAnnotationConfigServletWebServerApplicationContext
REACTIVEAnnotationConfigReactiveWebServerApplicationContext
NONEAnnotationConfigApplicationContext
  • refreshContext()这里标志着Spring IOC的正式初始化和启动,内部完成了大量工作,会扫描创建装配所有Bean

  • refresh完成后,整个应用就启动完毕了,run方法return ApplicationContext容器

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/14 17:04:02

CAN总线通信原理与STM32 bxCAN外设开发实战

以前一直觉得,搞懂 CAN 总线是个“早晚要做但不着急”的事。真正被逼着去弄明白,是某个项目里两块主控板之间需要用一根线传状态,板子距离两三米,线还从电机旁边走,UART 直接废掉,I2C 更是想都别想。换成 C…

作者头像 李华
网站建设 2026/10/14 17:03:57

前缀和+同余+哈希表:破解“连续子数组和可被k整除”的2024题22

1. 题面只有三行,但它如何骗过了我的第一反应1.1 原题描述与数据范围在整理2024年热题清单的时候,我注意到一道被很多人称为“2024年题22”的题。它出现的频率高得离谱,但绝大多数人只记得“这题很简单”,却说不出到底考了什么。题…

作者头像 李华
网站建设 2026/10/14 17:03:46

QSpinBox箭头位置换到左侧:QSS子控件定位与图片替换全解析

前阵子接了个界面改造的需求,设计稿上数字输入框的箭头位置跟默认控件完全不一样:向上的箭头要放到输入框左侧,向下的按钮要缩小藏起来,整个控件看起来像一个小巧的计数器。当时我理所当然地认为,既然是Qt的QSpinBox&a…

作者头像 李华
网站建设 2026/10/14 17:03:43

Godot Transform2D 完全指南:2D 变换矩阵原理、完整 API 与实战应用

文档教程游戏开发 【免费下载链接】godot-docs Godot Engine official documentation 项目地址: https://gitcode.com/GitHub_Trending/go/godot-docs 点击查看 免费下载 Transform2D 是 Godot 引擎内置的 23 变换矩阵 Variant 类型,由 x、y 两个基向量…

作者头像 李华
网站建设 2026/10/14 17:03:28

端到端图像水印嵌入与提取:深度学习实战指南

简介:这是一套基于PyTorch构建的端到端图像水印嵌入与提取系统,利用深度卷积网络实现鲁棒水印的联合优化,覆盖COCO、ImageNet、Cifar10与QRCode四类主流数据集,可满足深度学习课程设计、毕业设计、科研复现及工程原型验证等场景需…

作者头像 李华
网站建设 2026/10/14 17:03:26

AI前沿速递|AI学会“装傻“了!

2026年10月14日 三篇最新arXiv论文深度解读 导读: 2026年10月中旬,AI领域接连出现三个令人深思的突破。一篇被NeurIPS 2026接收的论文证明,AI模型可以利用密码学方法可证明地隐藏任意危险能力,让所有安全审计手段失效&#xff1b…

作者头像 李华