Spring Boot 启动流程源码解析 🚀

Spring Boot 启动流程源码解析 🚀

一、为什么要研究 Spring Boot 的启动流程?🤔

虽然日常开发中,我们只需一行 SpringApplication.run(...) 即可完成项目启动,但在以下场景中理解底层启动流程至关重要:

  • 自定义自动配置或构建 Starter 时,无法判断配置生效机制;

  • 出现 Bean 无法注入、配置未加载等问题时,排查无从下手;

  • 需要监听项目启动状态(如初始化缓存、注册服务等)时,事件机制掌握不清;

  • 面试中常被问到:Spring Boot 是怎么实现自动装配的?

所以,理解 Spring Boot 的启动过程,既是工程实践的基础,也是进阶高级开发的必经之路。

二、启动入口:SpringApplication.run() 🌱

最基础的启动类如下:

1
2
3
4
5
6
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

注解结构解析

  • @SpringBootApplication = @Configuration + @EnableAutoConfiguration + @ComponentScan

  • 自动扫描、注册配置类、开启自动装配,全部集成在这一个注解中

核心类:SpringApplication

在调用 run() 前,Spring Boot 会先构建一个 SpringApplication 对象:

1
2
3
4
5
6
7
public SpringApplication(Class<?>... primarySources) {
this.sources = new LinkedHashSet<>(Arrays.asList(primarySources));
this.webApplicationType = WebApplicationType.deduceFromClasspath();
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = deduceMainApplicationClass();
}

这里完成了应用类型推断、初始化器和监听器的加载,核心机制都围绕 spring.factories 文件展开。

三、Spring Boot 启动流程总览 🛠️

启动过程主要分为以下几个阶段:

graph TD
    A[创建 SpringApplication 实例] --> B[推断 Web 应用类型]
    B --> C[加载初始化器 ApplicationContextInitializer]
    C --> D[加载监听器 ApplicationListener]
    D --> E[推断主类 Main Class]
    E --> F[prepareEnvironment 创建并配置环境]
    F --> G[创建 ApplicationContext]
    G --> H[应用初始化器 applyInitializers]
    H --> I[加载 BeanDefinition]
    I --> J[刷新上下文 refreshContext]
    J --> K[收尾操作 afterRefresh]
    K --> L[发布 ApplicationStartedEvent]
    L --> M[发布 ApplicationReadyEvent]
    M --> N[启动完成]

关键事件发布顺序如下:

  1. ApplicationStartingEvent
  2. ApplicationEnvironmentPreparedEvent
  3. ApplicationContextInitializedEvent
  4. ApplicationPreparedEvent
  5. ApplicationStartedEvent
  6. ApplicationReadyEvent

四、重点源码解读 🔍

1️⃣ run() 方法调用链

1
2
3
4
5
6
7
8
9
public ConfigurableApplicationContext run(String... args) {
// 1. 启动计时器、启动监听器
// 2. 构造并配置环境
// 3. 构造 ApplicationContext
// 4. 执行 ApplicationContextInitializer
// 5. 加载 BeanDefinition
// 6. refresh() 触发完整的 Spring 生命周期
// 7. 发布 ApplicationStarted/Ready 等事件
}

2️⃣ 自动装配机制:@EnableAutoConfiguration
核心原理是加载 META-INF/spring.factories 中声明的自动配置类

使用了 SpringFactoriesLoader.loadFactoryNames(...)

配合 @ConditionalOnClass@ConditionalOnMissingBean 等条件注解动态判断配置是否生效

例如:

1
2
3
4
@ConditionalOnClass(DataSource.class)
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration { ... }

五、监听器与事件机制 🧩

Spring Boot 的事件驱动模型贯穿启动全过程,通过 ApplicationListener 可以接入每一个关键节点。例如:

1
2
3
4
5
6
public class MyStartupListener implements ApplicationListener<ApplicationReadyEvent> {
@Override
public void onApplicationEvent(ApplicationReadyEvent event) {
System.out.println("应用已就绪,开始初始化缓存...");
}
}

注册方式:

1
springApplication.addListeners(new MyStartupListener());

Spring Boot 启动流程源码解析 🚀
http://example.com/2024/02/09/java/springboot/springboot-startup/
作者
Donghao Ji
发布于
2024年2月10日
许可协议