Spring Boot 启动原理的核心机制
一、核心启动流程概览
Spring Boot 的启动流程可概括为 7 个关键阶段:
1. 加载启动类 (Main Class)
2. 初始化 SpringApplication 实例
3. 加载配置 & 准备环境 (Environment)
4. 创建 ApplicationContext(容器)
5. 刷新容器(核心:Bean 的加载与初始化)
6. 执行 Runner 接口(ApplicationRunner/CommandLineRunner)
7. 启动嵌入式 Web 服务器(如 Tomcat 或 Netty)
二、详细流程解析
1. 启动入口:main()
方法
触发点:执行 SpringApplication.run(Application.class, args)
。
@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
- 作用:初始化 Spring 容器并启动应用。
- 关键类:
SpringApplication
。
2. SpringApplication
的初始化
核心步骤:
- 推断应用类型:根据类路径决定是 Web 应用(Servlet、Reactive)还是普通应用。
- **加载
SpringApplicationInitializer
**:通过SpringFactoriesLoader
加载所有META-INF/spring.factories
中注册的初始化器。 - **加载
ApplicationListener
**:加载事件监听器(如ConfigFileApplicationListener
读取配置文件)。 - 推断主配置类:通过
main()
方法的启动类作为主配置源。
3. 环境准备(Environment)
关键操作:
- 合并配置源:加载默认配置、命令行参数、
application.properties
/application.yml
。 - 配置 Profiles:激活指定的环境配置(如
dev
,prod
)。 - **触发
ApplicationEnvironmentPreparedEvent
**:通知所有环境准备好的监听器。
代码示例:
// SpringApplication.java
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
4. 创建 ApplicationContext
根据应用类型创建容器:
- Web 应用(Servlet):创建
AnnotationConfigServletWebServerApplicationContext
。 - Web 应用(Reactive):创建
AnnotationConfigReactiveWebServerApplicationContext
。 - 非 Web 应用:创建
AnnotationConfigApplicationContext
。
关键过程:
- 通过反射实例化容器。
- 注册启动类(主配置类)到容器。
5. 容器刷新(核心阶段)
调用 AbstractApplicationContext#refresh()
方法:
- 准备阶段:设置容器 ID、初始化属性源。
- 解析配置类:通过
ConfigurationClassPostProcessor
处理@ComponentScan
、@Import
等注解。 - **执行
BeanFactoryPostProcessor
**:例如处理@ConfigurationProperties
或自定义配置。 - 注册并实例化 Bean:
- Spring Boot 自动配置:加载所有
META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
中的自动配置类(如DataSourceAutoConfiguration
)。 - 使用
@Conditional
系列注解(如@ConditionalOnClass
)决定是否创建 Bean。
- Spring Boot 自动配置:加载所有
- 初始化单例 Bean:触发
@PostConstruct
方法和InitializingBean
接口。 - 启动嵌入式服务器:如果是 Web 应用,触发
ServletWebServerApplicationContext#onRefresh()
以启动 Tomcat/Jetty 等服务器。
代码示例:
// SpringApplication.java
refreshContext(context); // 触发 refresh()
6. 执行 Runner 接口
执行顺序:
ApplicationRunner
的run()
方法。CommandLineRunner
的run()
方法。
用途:用于在应用启动后执行自定义逻辑(如初始化缓存、连接外部服务)。
7. 启动完成
触发事件:ApplicationReadyEvent
,标志应用已就绪。
三、自动配置(Auto-configuration)原理
1. 触发条件
- 依赖触发:项目的类路径中是否存在特定类(如
DataSource.class
)。 - 配置触发:
application.properties
中的属性是否匹配。
2. 实现机制
- **
@EnableAutoConfiguration
注解**:开启自动配置。 - **
spring.factories
文件**:在spring-boot-autoconfigure.jar
中定义所有自动配置类。 - 条件化注解:
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @ConditionalOnMissingBean(DataSource.class) public class DataSourceAutoConfiguration { /* ... */ }
3. 自动配置类示例
@Configuration
@ConditionalOnWebApplication(type = Type.SERVLET) // 条件判断
@ConditionalOnClass(DispatcherServlet.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)
public class DispatcherServletAutoConfiguration {@Beanpublic DispatcherServlet dispatcherServlet() {return new DispatcherServlet();}
}
四、嵌入式 Web 服务器启动
流程:
- 检测依赖:如
spring-boot-starter-web
包含 Tomcat。 - 创建 WebServer:在容器刷新阶段调用
ServletWebServerApplicationContext#onRefresh()
。 - 初始化 Servlet 容器:加载
DispatServlet
并注册到 ServletContext。 - 监听端口:默认启动在
8080
端口。
关键类:
TomcatServletWebServerFactory
(Tomcat 实现)。NettyReactiveWebServerFactory
(Netty 实现)。
五、核心流程图解
+----------------+ +--------------------+ +-------------------+
| main()方法启动 | --> | SpringApplication | --> | 加载配置 & 环境准备 |
+----------------+ +--------------------+ +-------------------+| |v v+----------------------+ +--------------------+| 创建 ApplicationContext | --> | refresh() 容器刷新 |+----------------------+ +--------------------+| |v v+----------------------+ +--------------------+| 执行 Runner 接口逻辑 | <-- | 启动嵌入式 Web 服务器 |+----------------------+ +--------------------+
六、调试与扩展
1. 调试启动流程
- 添加启动参数:
--debug
参数打印自动配置的条件评估报告。 - 监控事件:实现
ApplicationListener
监听不同阶段事件(如ApplicationStartingEvent
)。
2. 自定义扩展
- 自定义 Starter:
- 创建
META-INF/spring.factories
文件。 - 定义自动配置类(使用
@Conditional
注解)。
- 创建
- 覆盖默认配置:
@Bean @ConditionalOnMissingBean // 覆盖默认 Bean public DataSource myDataSource() { return new CustomDataSource(); }
七、常见问题
问题 | 解决方案 |
---|---|
Bean 冲突导致启动失败 | 使用 @Primary 注解指定主 Bean,或在配置类中使用 @ConditionalOnMissingBean |
端口被占用 | 修改 server.port 属性或在命令行指定 --server.port=8081 |
自动配置未生效 | 检查类路径是否存在触发自动配置的依赖,并确保没有手动排除自动配置类 |
八、总结
- 核心理念:约定优于配置,通过自动化和条件化加载降低开发复杂度。
- 启动优化:分析
SpringApplication
的初始化阶段和容器刷新过程可针对性优化启动时间。 - 扩展能力:通过自定义 Starter 和监听器灵活扩展框架功能。
相关文章:
Spring Boot 启动原理的核心机制
一、核心启动流程概览 Spring Boot 的启动流程可概括为 7 个关键阶段: 1. 加载启动类 (Main Class) 2. 初始化 SpringApplication 实例 3. 加载配置 & 准备环境 (Environment) 4. 创建 ApplicationContext(容器) 5. 刷新容器&#…...

spring中的@Lazy注解详解
一、核心功能与作用 Lazy 注解是 Spring 框架中用于延迟 Bean 初始化的核心工具,通过将 Bean 的创建推迟到首次使用时,优化资源利用和启动性能。其核心功能包括: 延迟初始化 默认情况下,Spring 在容器启动时立即初始化所有单例 …...

视觉-语言-动作模型:概念、进展、应用与挑战(上)
25年5月来自 Cornell 大学、香港科大和希腊 U Peloponnese 的论文“Vision-Language-Action Models: Concepts, Progress, Applications and Challenges”。 视觉-语言-动作 (VLA) 模型标志着人工智能的变革性进步,旨在将感知、自然语言理解和具体动作统一在一个计…...

语义分割模型部署到嵌入式终端的通用操作流程
以下是语义分割模型部署到嵌入式终端的通用操作流程,结合不同硬件平台(如华为Atlas、地平线J5、树莓派等)的共性需求整理而成: 一、环境准备与工具链配置 1. 嵌入式开发环境搭建 安装交叉编译工具链(如ARM-GCC&…...

R1-Searcher:用强化学习解锁大语言模型检索新能力!
R1-Searcher:用强化学习解锁大语言模型检索新能力! 大语言模型(LLMs)发展迅猛,却常因依赖内部知识而在复杂问题上“栽跟头”。今天解读的论文提出R1-Searcher框架,通过强化学习提升LLMs检索能力。它表现超…...

第一篇 世界观安全
目录 STRIDE模型 五大原则 一黑白名单 二最小权限原则 三纵深防御原则 四数据和代码分离 五不可预测原则 安全的问题本质是信任问题。 并且安全是一个持续的过程。 安全的三要素:机密性,完整性(可以采用数字签名)&#x…...
RNN(循环神经网络)原理与结构
1 RNN(循环神经网络)原理与结构 循环神经网络(Recurrent Neural Network, RNN)是一类专门用于处理序列数据(如时间序列、文本、语音等)的深度学习模型。与传统的前馈神经网络不同,RNN在每个时间…...

mac M2能安装的虚拟机和linux系统系统
目前网上的资料大多错误,能支持M2的很少。 推荐安装的改造过的centos7也无法进行yum操作,建议安装centos8 VMware Fusion下载地址: https://pan.baidu.com/s/14v3Dy83nuLr2xOy_qf0Jvw 提取码: jri4 centos8下载地址: https://…...

无偿帮写毕业论文
以下教程教你如何利用相关网站和AI免费帮你写一个毕业论文。毕竟毕业论文只要过就行,脱产学习这么多年,终于熬出头了,完成毕设后有空就去多看看亲人好友,祝好! 一、找一个论文模板(最好是overleaf) 废话不多说&#…...

智能网联汽车“内外协同、虚实共生”的通信生态
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界…...

Linux操作系统从入门到实战(六)Linux开发工具(上)详细介绍什么是软件包管理器,Linux下如何进行软件和软件包的安装、升级与卸载
Linux操作系统从入门到实战(六)Linux开发工具(上)详细介绍什么是软件包管理器,Linux下如何进行软件和软件包的安装、升级与卸载 前言一、 软件包管理器1.1 传统安装方式的麻烦:从源代码说起1.2 软件包&…...

物流无人机自动化装卸技术解析!
一、自动化装卸技术模块的技术难点 1. 货物多样性适配 物流场景中货物包装类型、尺寸、材质差异大,如农产品、医疗物资、工业设备等,要求装卸模块具备高度柔性化设计。例如,单元货物需视觉识别系统进行单个抓取,而整托货物需大…...
基于构件的开发方法与传统开发方法的区别
在软件开发领域,基于构件的开发方法和传统开发方法有着截然不同的特点与应用效果,这些差异显著影响着项目的实施过程与最终成果。下面,我们将从多个关键维度展开对比分析。 一、开发模式:线性搭建与模块组装 传统开发方法遵循线性的、自顶向下的流程,就像搭建一座高楼…...
详解 IRC协议 及客户端工具 WeeChat 的使用
本文将详细介绍 Internet Relay Chat(IRC)协议及其历史、基本概念、核心功能,以及流行的 IRC 客户端 WeeChat 的安装、配置和使用方法。内容力求准确、详尽,涵盖 IRC 的技术背景、使用场景,以及 WeeChat 的高级功能和实…...

IOT藍牙探測 C2 架構:社會工程/節點分離防追尋
BMC 地址:https://github.com/MartinxMax/bmc/releases/tag/V1.5 藍牙 MAC 偵測節點的物聯網分散式 C2 架構,可與 S-Cluster 交互。 場景 A:潛伏偵測 駭客組織會將 BMC 裝置秘密部署在目標建築物周圍(例如牆外、通風口或垃圾間等隱蔽地點&…...
Koa知识框架
一、核心概念 1. 基本特点 由 Express 原班人马开发的下一代 Node.js Web 框架 基于中间件的洋葱圈模型 轻量级核心(仅约 600 行代码) 完全使用 async/await 异步流程控制 没有内置任何中间件,高度可定制 2. 核心对象 Application (Ko…...

FreeRTOS学习记录(变量命名规则全解、文件介绍)
目录 FreeRTOS 变量命名规则详解 一、变量命名前缀规则 (一)数据类型相关前缀 (二)功能模块相关前缀 (三)宏定义 二、变量命名与文件的关系 (一)核心源文件中的变…...

Qt 中 QWidget涉及的常用核心属性介绍
欢迎来到干货小仓库 一匹真正的好马,即使在鞭子的影子下,也能飞奔 1.enabled API说明isEnabled()获取到控件的可用状态setEnabled()设置控件是否可使用.true:可用,false:禁用 禁用:指该控件不能接收任何用…...

Open CASCADE学习|由大量Edge构建闭合Wire:有序与无序处理的完整解析
在CAD建模中,构建闭合的Wire(线框)是拓扑结构生成的基础操作。OpenCascade(OCCT)作为强大的几何建模库,支持从离散的Edge(边)构建Wire,但在实际应用中,边的有序性直接影响构建的成功率。本文将详细探讨有序与无序两种场景下的实现方法,并提供完整代码示例。 一、有序…...

linux 开发小技巧之git增加指令别名
众所周知,git的指令执行时都得敲好几个字符才能补充上来,比如常用的git status,是不是要将全部的字符一个个地在键盘敲上来,有没有更懒惰点办法,可以将经常用到的git命令通过其他的别名的方式填充,比如刚刚…...

一文读懂如何使用MCP创建服务器
如果你对MCP(模型上下文协议)一窍不通,在阅读本篇文章之前(在获得对MCP深度认识之前),你可以理解为学习MCP就是在学习一个python工具库mcp,类似于其它python工具库一样,如numpy、sys…...

Python Day23 学习
继续SHAP图绘制的学习 1. SHAP特征重要性条形图 特征重要性条形图(Feature Importance Bar Plot)是 SHAP 提供的一种全局解释工具,用于展示模型中各个特征对预测结果的重要性。以下是详细解释: 图的含义 - 横轴:表示…...

VS Code 重磅更新:全新 MCP 服务器发现中心上线
目前各种 MCP 客户端层出不穷,但是安装 MCP 服务却格外繁琐,尤其 VS Code 中无界面化的 MCP 服务配置方式,效率较低。 Copilot MCP 是一个 VS Code 插件,在今天发布的新版本中,插件支持了自动发现与安装开源 MCP 服务…...
Ubuntu 服务器管理命令笔记
这份命令笔记涵盖了 Ubuntu 服务器管理的各个方面,包括系统更新、用户管理、安全配置、网络诊断等,适合日常使用与技术分享。 系统管理命令 sudo apt update && sudo apt upgrade -y # 更新系统 sudo reboot …...
web 自动化之 Unittest 四大组件
文章目录 一、如何开展自动化测试1、项目需求分析,了解业务需求 web 功能纳入自动化测试2、选择何种方式实现自动化测试 二、Unittest 框架三、TestCase 测试用例四、TestFixture 测试夹具 执行测试用例前的前置操作及后置操作五、TestSuite 测试套件 & TestLoa…...

一、网络基础
IPv4:32位二进制 -- 点分十进制标识 192.168.1.1(连续的32位,为了好看方便每8位一段) IPv6:128位二进制 IP(Internet协议) 洪泛:除流量进入接口外的所有接口的复制 OSI模型&#…...

基于HTML+JavaScript+CSS实现教学网站
摘要 21世纪是信息化的时代,信息化物品不断地涌入我们的生活。同时,教育行业也产生了重大变革。传统的身心教授的模式,正在被替代。互联网模式的教育开辟了一片新的热土。 这算是对教育行业的一次重大挑战。截至目前,众多教育行…...

告别卡顿,图片查看界的“速度与激情”
嘿,小伙伴们!今天电脑天空给大家介绍一款超好用的图片查看神器——ImageGlass!这可不是普通的图片查看软件哦,它简直就是图片界的“全能王”。首先,它能打开的图片格式多到让你眼花缭乱,什么PNG、JPEG、GIF…...
基于STM32、HAL库的RN8209C电能计量芯片驱动程序设计
一、简介: RN8209C是一款高精度电能计量芯片,主要应用于单相电能表、智能插座、电力监控等领域。它具有以下特点: 支持全差分输入,可测量电压、电流、有功功率、无功功率、视在功率、功率因数等参数 内置24位Σ-Δ ADC,提供高精度测量 支持SPI和UART通信接口 内置温度传感…...
1 计算机网络
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言:点击跳转飞书文档[ 1. 第一章:概述:计网初识 ](https://zcny77krlrp8.feishu.cn/docx/U8T8d3PUOoMi7vxD4vGc8O51nrb)[2. 第…...