目录

一、Spring Boot 启动的入口

二、SpringApplication 是什么?

三、SpringApplication.run() 的整体流程

四、启动流程详解

1. 创建 SpringApplication 对象

2. 准备运行环境(Environment)

3. 打印 Banner

4. 创建 ApplicationContext(容器)

5. 刷新容器(refresh)

6. 自动装配生效

7. 启动内嵌 Web 服务器

8. 发布启动完成事件

五、Spring Boot 启动流程一句话总结


在使用 Spring Boot 开发时,都会写下这样一行代码:

SpringApplication.run(Application.class, args);

应用就“神奇地”启动了:
容器创建、自动配置生效、内嵌 Tomcat 启动、接口可访问。

那么问题来了:Spring Boot 启动过程中,到底发生了什么?

一、Spring Boot 启动的入口

Spring Boot 的启动入口非常明确:

public static void main(String[] args) {
    SpringApplication.run(Application.class, args);
}

这行代码,实际上完成了 整个应用生命周期的初始化

二、SpringApplication 是什么?

SpringApplication 是 Spring Boot 启动过程的核心类
它负责:

  • 推断应用类型
  • 创建并刷新 Spring 容器
  • 触发自动装配
  • 启动 Web 服务器

所有启动流程,最终都由它统一调度。

三、SpringApplication.run() 的整体流程

可以将启动流程抽象为 8 个关键步骤

创建应用 → 准备环境 → 创建容器 → 加载配置 → 刷新容器 → 启动服务器 → 完成启动

四、启动流程详解

1. 创建 SpringApplication 对象

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 的:

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 容器,加载自动配置并启动内嵌服务器,最终完成应用启动。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐