Spring Boot 启动原理深度解析

目录

[一、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

配置优先级就在这一步确定。

如果你看到控制台里的 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 容器,加载自动配置并启动内嵌服务器,最终完成应用启动。

相关推荐
cipher3 小时前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
毅航4 小时前
自然语言处理发展史:从规则、统计到深度学习
人工智能·后端
JxWang054 小时前
Task04:字符串
后端
树獭叔叔4 小时前
10-让模型更小更聪明,学而不忘:知识蒸馏与持续学习
后端·aigc·openai
JxWang055 小时前
Task02:链表
后端
只会cv的前端攻城狮5 小时前
Elpis-Core — 融合 Koa 洋葱圈模型实现服务端引擎
前端·后端
codetown5 小时前
2026年Zig编程语言权威指南:从系统级底层架构到现代软件工程实践
后端·程序员
cg337 小时前
cc-connect,十分钟帮你把 claude code 连接到微信,飞书,钉钉等等平台
后端·openai
用户1427868669327 小时前
Java多态的底层真相:JVM到底怎么知道该调哪个方法?(面试高频)
后端