目录
[一、Spring Boot 启动的入口](#一、Spring Boot 启动的入口)
[二、SpringApplication 是什么?](#二、SpringApplication 是什么?)
[三、SpringApplication.run() 的整体流程](#三、SpringApplication.run() 的整体流程)
[1. 创建 SpringApplication 对象](#1. 创建 SpringApplication 对象)
[2. 准备运行环境(Environment)](#2. 准备运行环境(Environment))
[3. 打印 Banner](#3. 打印 Banner)
[4. 创建 ApplicationContext(容器)](#4. 创建 ApplicationContext(容器))
[5. 刷新容器(refresh)](#5. 刷新容器(refresh))
[6. 自动装配生效](#6. 自动装配生效)
[7. 启动内嵌 Web 服务器](#7. 启动内嵌 Web 服务器)
[8. 发布启动完成事件](#8. 发布启动完成事件)
[五、Spring Boot 启动流程一句话总结](#五、Spring Boot 启动流程一句话总结)
在使用 Spring Boot 开发时,都会写下这样一行代码:
java
SpringApplication.run(Application.class, args);
应用就"神奇地"启动了:
容器创建、自动配置生效、内嵌 Tomcat 启动、接口可访问。
那么问题来了:Spring Boot 启动过程中,到底发生了什么?
一、Spring Boot 启动的入口
Spring Boot 的启动入口非常明确:
java
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
这行代码,实际上完成了 整个应用生命周期的初始化。
二、SpringApplication 是什么?
SpringApplication 是 Spring Boot 启动过程的核心类 ,
它负责:
- 推断应用类型
- 创建并刷新 Spring 容器
- 触发自动装配
- 启动 Web 服务器
所有启动流程,最终都由它统一调度。
三、SpringApplication.run() 的整体流程
可以将启动流程抽象为 8 个关键步骤:
创建应用 → 准备环境 → 创建容器 → 加载配置 → 刷新容器 → 启动服务器 → 完成启动
四、启动流程详解
1. 创建 SpringApplication 对象
java
new SpringApplication(primarySources)
在这个阶段,Spring Boot 会:
- 判断应用类型(Servlet / Reactive / None)
- 加载 ApplicationContextInitializer
- 加载 ApplicationListener
这一步为后续启动做准备。
2. 准备运行环境(Environment)
Spring Boot 会创建并准备 Environment:
加载配置文件(application.yml)
加载系统属性、环境变量
处理 spring.profiles.active
配置优先级就在这一步确定。
3. 打印 Banner
如果你看到控制台里的 Spring Boot Banner,说明应用已经进入正式启动流程。
4. 创建 ApplicationContext(容器)
根据应用类型创建容器:
Web 项目 → ServletWebServerApplicationContext
非 Web → AnnotationConfigApplicationContext
Spring 容器就是在这一步创建的。
5. 刷新容器(refresh)
这是整个启动过程中最核心的一步 ,
本质上就是 Spring 的:
java
ApplicationContext.refresh()
在这一步中完成:
- BeanDefinition 解析
- BeanFactory 初始化
- Bean 实例化与依赖注入
- AOP、事务等基础设施加载
- 自动装配生效
Spring Boot 的"魔法",大多发生在这里。
6. 自动装配生效
在容器刷新过程中:
- @EnableAutoConfiguration
- 加载自动配置类
- 条件注解判断
- 注册 Bean
自动装配是 启动流程的一部分,而不是单独一步。
7. 启动内嵌 Web 服务器
如果是 Web 项目:
- 创建 Tomcat / Jetty
- 注册 DispatcherServlet
- 绑定端口
- 启动监听
这是 Spring Boot 能直接 java -jar 启动的关键。
8. 发布启动完成事件
- 发布 ApplicationReadyEvent
- 执行 CommandLineRunner
- 执行 ApplicationRunner
此时:应用已完全启动,可以对外提供服务。
五、Spring Boot 启动流程一句话总结
Spring Boot 通过 SpringApplication.run() 创建并刷新 Spring 容器,加载自动配置并启动内嵌服务器,最终完成应用启动。