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

相关推荐
观音山保我别报错2 小时前
Spring Boot 项目学习内容详解(一)
spring boot·后端·学习
零基础的修炼2 小时前
算法---常见位运算总结
java·开发语言·前端
蜂蜜黄油呀土豆2 小时前
Java虚拟机内存模型解析与内存管理问题
java·jvm·内存管理·内存泄漏·内存溢出
wgslucky2 小时前
sm2 js加密,java服务器端解密
java·开发语言·javascript
Hx_Ma162 小时前
SpringBoot配置文件占位符
java·spring boot·后端
韩立学长2 小时前
【开题答辩实录分享】以《在线预问诊系统设计与实现》为例进行选题答辩实录分享
vue.js·spring boot·mysql
running up that hill2 小时前
日常刷题记录
java·数据结构·算法
独自破碎E2 小时前
【快手手撕】合并区间
android·java
Loo国昌2 小时前
【LangChain1.0】第十四阶段:Agent最佳设计模式与生产实践
人工智能·后端·算法·语言模型·架构