Spring Boot 启动顺序

devtools/2025/3/20 2:57:26/

Spring Boot 启动顺序主要涉及多个关键步骤,涵盖 SpringApplication 初始化、环境准备、应用上下文创建,以及 运行阶段。以下是详细的启动顺序解析:


1. 启动引导(Bootstrap)

入口:SpringApplication.run()

  • 创建 SpringApplication 对象
    • 确定当前应用类型(WebApplicationType
    • 加载 ApplicationContextInitializer
    • 加载 ApplicationListener
    • 解析 @SpringBootConfiguration

2. 环境准备(Prepare Environment)

  • 加载 SpringApplicationRunListeners 并广播 starting 事件
  • 构建 Environment(环境变量 + 配置)
    • 读取 application.properties / application.yml
    • 解析 SpringApplicationRunListener(如 ConfigFileApplicationListener
    • 处理 ConfigurableEnvironment,合并系统环境变量和应用配置
  • 应用 ApplicationContextInitializer
  • 允许外部初始化 Spring 上下文,例如:
    public class MyApplicationContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {System.out.println("ApplicationContextInitializer 执行!");}
    }
    

3. 应用上下文(Application Context)初始化

  • 创建 ApplicationContext(不同类型应用选择不同上下文)
    • 普通应用:AnnotationConfigApplicationContext
    • Web 应用:AnnotationConfigServletWebServerApplicationContext
    • 响应式 Web 应用:AnnotationConfigReactiveWebServerApplicationContext
  • 注册 BeanFactoryPostProcessor
    • 例如 ConfigurationClassPostProcessor,负责解析 @Configuration
  • 调用 BeanDefinitionRegistryPostProcessor
    • 例如 @ComponentScan@Import 解析
  • 加载 @Configuration@Bean

 

4. Bean 加载(Bean Factory)

  • 调用 @Autowired@Value 进行依赖注入
  • 执行 @PostConstruct 方法
  • 调用 BeanPostProcessor 进行 AOP / 代理增强
    • 例如 @Transactional 代理
  • 调用 SmartInitializingSingleton

5. 启动 ApplicationRunnerCommandLineRunner

  • 处理 CommandLineRunnerApplicationRunner
@Component
public class MyRunner implements CommandLineRunner {@Overridepublic void run(String... args) {System.out.println("CommandLineRunner 执行");}
}
@Component
public class MyAppRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) {System.out.println("ApplicationRunner 执行");}
}

 ApplicationRunner 适用于更复杂的参数解析,CommandLineRunner 适用于简单参数处理。

6. 启动完成(Application Started)

  • 广播 ApplicationStartedEvent
  • 启动 Web 服务器(如 TomcatJetty
  • 监听 ApplicationReadyEvent,应用进入运行状态
  • 运行 Spring Boot Actuator(如启用了 management 监控)
  • Spring Boot 启动完成!

Spring Boot 启动顺序总结

  1. SpringApplication 初始化
  2. 加载 Environment(配置解析)
  3. 创建 ApplicationContext 并注册 BeanFactoryPostProcessor
  4. 注册 BeanPostProcessor 进行 AOP 代理
  5. 调用 SmartInitializingSingleton
  6. 调用 CommandLineRunnerApplicationRunner
  7. 广播 ApplicationReadyEvent
  8. 应用启动完成,准备处理请求

如果你想调试启动过程,可以加 debug 选项:

java -jar myapp.jar --debug

 


http://www.ppmy.cn/devtools/168512.html

相关文章

本地部署deepseek-r1建立向量知识库和知识库检索实践【代码】

目录 一、本地部署DS 二、建立本地知识库 1.安装python和必要的库 2.设置主目录工作区 3.编写文档解析脚本 4.构建向量数据库 三、基于DS,使用本地知识库检索 本地部署DS,其实非常简单,我写了一篇操作记录,我终于本地部署了DeepSeek-R1(图文全过程)-CSDN博客 安装…

手机蓝牙项目

一.蓝牙模块连接 首先将蓝牙模块与ch340模块连接然后打开串口软件调号参数。之后发送指令AT看是否有回复OK&#xff0c;有则连接成功&#xff0c;无说明串口没有连接好。 二.修改波特率 连接没有问题去查看波特率&#xff0c;然后修改波特率为我们串口代码写的&#xff0c;波…

YOLOv11小白的进击之路(九)创新YOLO11损失函数之NWD损失函数源码解读

之前的博客也有对YOLO11的损失函数进行过源码分析&#xff0c;可以参考&#xff1a;YOLOv11小白的进击之路&#xff08;六&#xff09;创新YOLO的iou及损失函数时的源码分析_yolov11的损失函数是什么-CSDN博客最近在做小目标检测的时候注意到了NWD损失函数&#xff0c;这里对其…

【课堂笔记】定理:样本越多,测量的经验损失越接近真实损失

定理描述 给定一个模型 f : X → Y f:X \to Y f:X→Y&#xff0c;设数据分布 D \mathcal{D} D定义在 X Y X \times Y XY&#xff0c;表示数据真实分布&#xff0c;且假设训练集和测试集的样本均从 D \mathcal{D} D中独立同分布(i.i.d)抽取。   设损失函数为 l : Y Y → R l…

Go红队开发—日志打印优化

文章目录 日志log输出打印日志控制测试源码 slog输出打印修改默认等级修改输出目的自定义logger添加日志细节子logger 日志颜色修改源码 各位师傅exp与poc编写暂时鸽了&#xff0c;感觉web编程那章节学完自己就能编写&#xff0c;想不出有什么能够学习的地方&#xff0c;因为po…

[网络][tcp协议]:tcp报头

tcp(传输控制协议)是一种面向字节流的传输层协议,相较于udp协议,tcp能保证传输数据的可靠性与准确性,tcp也是目前最常见的传输层协议 本文主要介绍tcp报头各个字段的含义与用途 注:保留6位和6位标记位是目前最普遍的写法,在我查资料时,发现有一些拓展情况,会在后文细说 最简单的…

算法刷题记录——LeetCode篇(6) [第501~600题](持续更新)

(优先整理热门100及面试150&#xff0c;不定期持续更新&#xff0c;欢迎关注) 543. 二叉树的直径 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。 两节点之间路…

爬虫逆向:详细讲述iOS底层原理及机制

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. iOS 系统架构1.1 Core OS 层1.2 Core Services 层1.3 Media 层1.4 Cocoa Touch 层2. iOS 的核心机制2.1 应用生命周期2.2 内存管理2.3 多线程2.4 文件系统2.5 网络通信3. iOS 的启动流程4. iOS 的安全机制4.1 代码签…