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

Spring Boot 启动原理(SpringApplication.run(...) 流程)

一、Spring Boot 启动原理(SpringApplication.run(...) 流程)

  1. 创建 SpringApplication 实例

    • SpringApplication.run(…) 首先根据传入的主启动类(带有 @SpringBootApplication 注解的类)构造一个 SpringApplication 对象。

    • 在构造过程中,会收集环境(Environment)、监听器(ApplicationListener)、初始器(ApplicationContextInitializer)等。

  2. 准备环境(Environment)

    • 通过 ConfigFileApplicationListener 加载配置文件(application.properties / application.yml),并把它们解析进 Environment

    • 支持多种配置源(命令行参数、系统环境变量、配置文件、Spring Cloud 配置中心等),并按照优先级合并。

  3. 发布事件:ApplicationStartingEvent

    • 在真正创建 ApplicationContext 之前,先发布一个“启动开始”事件,供用户或框架中其他组件监听。

  4. 创建并配置 ApplicationContext

    • 根据应用类型(Web 应用:AnnotationConfigServletWebServerApplicationContext;非 Web:AnnotationConfigApplicationContext),实例化对应的 ApplicationContext

    • EnvironmentResourceLoaderApplicationArguments 等注入上下文。

    • 调用所有注册的 ApplicationContextInitializer,允许用户在上下文刷新前做手动调整。

  5. 注册 Bean 定义

    • 扫描启动类及其子包下所有带注解的组件(@Component, @Service, @Controller…)

    • 加载自动配置:

      • 利用 spring.factories 中的 EnableAutoConfiguration 条目,通过 AutoConfigurationImportSelector 找到所有可能的自动配置类

      • 条件注解(@ConditionalOnClass@ConditionalOnMissingBean…)决定哪些自动配置会真正生效

  6. 刷新(context.refresh()

    • 完整地解析并实例化所有 Bean,执行 Bean 后处理器(BeanPostProcessor)、事件发布(ContextRefreshedEvent)等钩子

    • 如果是 Web 应用,会启动内嵌的 Servlet 容器(Tomcat/Jetty/Undertow)

  7. 运行回调

    • 所有注册的 ApplicationRunnerCommandLineRunner 会被依次调用,执行用户自定义的启动逻辑

  8. 完成启动

    • 发布 ApplicationReadyEvent,标志应用已准备就绪开始接收请求;

    • Spring Boot 会保持运行,直到收到关闭信号或调用 context.close()

流程图

对比

讲的步骤图中对应模块/步骤
1. new SpringApplication() 构造【黄色区域】“构造函数”
2. 加载 Environment(配置文件、属性源)“加载属性资源”→“创建配置环境”
3. 调用各类 Initializer & Listener 注册“init 加载初始化器”→ “设置所有可用应用程序监听器”→getRunListeners(args)
4. 打印 Banner“打印 banner 图案”(step3)
5. 创建并准备好 ApplicationContext“上下文创建”(step6.1 根据类型创建 web/standard 上下文)
6. 调用 prepareContext(步骤7、8、10)“准备上下文并加载资源”(step7、step8、step10)
7. 执行 refreshContext“上下文刷新 refreshContext”(step9)
8. afterRefresh & 发布事件“上下文后置处理 afterRefresh”→“发布应用上下文启动完成”
9. 执行 Runner(ApplicationRunner/CommandLineRunner)“执行 Runner 逻辑”(step13)

简而言之:

  • 黄色区域 对应我说的“准备阶段”(构造、加载配置、注册监听器/初始化器);

  • 红色区域 对应“运行阶段”(打印 Banner、创建/刷新 Spring 容器、发布事件、最后执行 Runner)。

http://www.xdnf.cn/news/14142.html

相关文章:

  • 【Playwright MCP 实战分享:AI时代的浏览器自动化测试】
  • 销售预测的方法与模型(三)丨安全库存与再订货(补货)
  • AndroidMJ-基础-05
  • 数字人分身系统之数字人克隆功能板块开发,支持OEM
  • 一文了解sonar的搭建和使用
  • 基于openlayers开发北斗应用支撑平台
  • 1.2、SDH的复用结构
  • 2025年真实面试问题汇总(三)
  • 开启奇妙的 VR 刀剑博物馆之刀剑世界​
  • 大模型及agent开发1——基础知识及实现具备Funcation Calling功能的智能电商客服
  • 在C#中的锁
  • druid 数据库密码加密
  • FEMFAT许可与软件版本对应关系
  • 深度解析一下 llama.cpp 的源代码
  • 每日算法刷题Day30 6.13:leetcode二分答案2道题,用时1h10min
  • 打印机共享问题一键解决,附带设置维护工具
  • Python Day50 学习(仍为日志Day19的内容复习)
  • kafka版本升级3.5.1-->3.9.1(集群或单体步骤一致)
  • B/S架构
  • 上海市计算机学会竞赛平台2022年4月月赛丙组步步高
  • Qoppa Software提供的15款PDF产品组件科学学习
  • HarmonyOS 组件复用面试宝典 [特殊字符]
  • 【技术工具】源码管理 - GIT工具
  • Java 传输较大数据的相关问题解析和面试问答
  • ffmpeg subtitles 字幕不换行的问题解决方案
  • LeetCode 209.长度最小的子数组
  • 常见的数据处理方法有哪些?ETL中的数据处理怎么完成
  • 海马优化算法优化支持向量回归(SVR)模型项目
  • DAO 代码说明文档
  • 【计算机系统结构】期末复习