Spring Boot 的启动原理
Spring Boot 是由 Pivotal 团队发布的一个开源框架,它基于 Spring 框架,旨在简化企业级应用程序的开发过程。与传统的 Spring 项目相比,Spring Boot 提供了一种更加简洁、高效的方式来构建和部署应用程序。其核心理念是“约定优于配置”和“自动化配置”,使得开发人员能够快速构建出一个生产级别的应用程序,而无需手动编写大量配置文件。
要深入了解 Spring Boot 的启动原理,首先需要了解其主要的特性和组件。Spring Boot 通过自动化配置、内嵌式服务器、启动器(Starter)和自动化的环境配置等手段,极大地简化了传统 Spring 项目的启动和配置过程。本文将详细探讨 Spring Boot 的启动原理,帮助开发者更好地理解这个框架是如何工作的。
1. Spring Boot 启动过程概述
Spring Boot 的启动过程是一个涉及多个步骤的流程。简而言之,当我们运行一个 Spring Boot 应用时,Spring Boot 会执行以下几个主要步骤:
- 创建 Spring 应用上下文:Spring Boot 会初始化一个应用上下文(
ApplicationContext
),并通过注解扫描和配置文件加载来自动化配置 bean。 - 加载自动配置类:基于应用的环境、依赖关系和配置,Spring Boot 自动选择适合的配置类。
- 启动内嵌式 Web 服务器:对于 Web 应用,Spring Boot 会内嵌启动一个 Web 服务器(如 Tomcat、Jetty 或 Undertow)。
- 初始化 Spring Beans:Spring Boot 会扫描并初始化应用中的 Spring Beans,使其准备好供应用使用。
- 执行命令行逻辑:如果有实现
CommandLineRunner
或ApplicationRunner
接口的类,Spring Boot 会在应用启动后执行这些类中的方法。 - 发布应用事件:Spring Boot 会发布应用启动相关的事件,开发者可以监听这些事件来执行一些额外的初始化任务。
接下来,我们将逐步深入剖析这个启动过程中的每一个关键步骤。
2. SpringApplication 类和 run 方法
Spring Boot 应用的启动实际上是由 SpringApplication
类来控制的。SpringApplication
提供了一个静态方法 run()
,该方法是启动 Spring Boot 应用的入口点。在调用 SpringApplication.run(Application.class, args)
时,Spring Boot 会做出以下几件事:
- 初始化 Spring 应用上下文:
SpringApplication.run()
首先会创建一个ApplicationContext
(默认是AnnotationConfigApplicationContext
或GenericWebApplicationContext
),它会负责管理 Spring Beans 的生命周期。 - 加载配置文件:Spring Boot 会查找并加载配置文件,默认情况下,它会加载位于
src/main/resources/application.properties
或application.yml
中的配置。配置文件中的属性会自动绑定到 Spring Boot 提供的各种自动配置类中,帮助配置数据库连接、消息队列、日志级别等。 - 启动 Spring 容器:Spring Boot 会初始化所有的 bean、执行依赖注入,并启动应用的核心功能模块。
- 启动内嵌 Web 服务器:如果是 Web 应用,
SpringApplication
会启动一个内嵌式的 Web 服务器,如 Tomcat。Spring Boot 默认使用 Tomcat,但也可以选择 Jetty 或 Undertow 等服务器。
@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
@SpringBootApplication
注解是 Spring Boot 中一个重要的注解,它相当于 @Configuration
、@EnableAutoConfiguration
和 @ComponentScan
三个注解的组合,提供了一个简洁的方式来启动 Spring 应用。
3. 自动配置(AutoConfiguration)
Spring Boot 的一大亮点就是它的自动配置机制。传统的 Spring 应用需要开发者手动编写大量的配置,而 Spring Boot 通过自动配置来简化这一过程。自动配置的核心是 @EnableAutoConfiguration
注解。这个注解会自动引入一系列配置类,这些配置类会根据应用的实际需求自动为你配置合适的 bean。
例如,如果你的项目中引入了数据库驱动,Spring Boot 会自动配置一个数据源并连接数据库;如果你的项目中使用了 Spring MVC,Spring Boot 会自动配置一个 DispatcherServlet 和相关的 Web 配置;如果你使用了 Spring Security,Spring Boot 会自动配置一个安全的 Web 环境。
自动配置通过 @Conditional
注解来控制不同配置的条件。比如,只有在类路径中存在某个特定的库时,相关的自动配置才会被激活。这意味着 Spring Boot 会根据你项目中的实际依赖来判断是否启用某些功能。
@Configuration
@ConditionalOnClass(DataSource.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceAutoConfiguration {// 数据源自动配置的代码
}
上面的 DataSourceAutoConfiguration
类就是一个典型的自动配置类,它通过 @ConditionalOnClass(DataSource.class)
注解来判断是否存在 DataSource
类,如果存在,就会自动配置数据源。
4. 内嵌式 Web 服务器
Spring Boot 的一个重要特性就是内嵌式 Web 服务器的支持。在传统的 Spring 应用中,开发者需要将应用部署到外部的 Web 容器中(如 Tomcat、Jetty 等)。而在 Spring Boot 中,Web 服务器是内嵌的,意味着你可以直接通过 java -jar
命令启动应用,而无需依赖外部服务器。
Spring Boot 默认使用 Tomcat 作为内嵌 Web 服务器,但也支持 Jetty 和 Undertow 等其他 Web 服务器。你只需要在 pom.xml
或 build.gradle
文件中添加相应的依赖即可切换 Web 服务器。
例如,如果你要使用 Jetty 作为内嵌 Web 服务器,可以在 pom.xml
中添加如下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
内嵌式 Web 服务器使得 Spring Boot 应用具有了极大的灵活性。开发者可以在开发过程中直接运行应用,调试时不再需要手动部署到 Web 容器,极大提升了开发效率。
5. 初始化 Spring Beans
Spring Boot 启动时,会根据 @ComponentScan
注解扫描指定包及其子包下的所有类,并将符合条件的类注册为 Spring Bean。Spring Boot 会在启动过程中自动注册常见的组件(如 @RestController
、@Service
、@Repository
等注解标注的类),无需开发者手动配置。
在 Spring Boot 应用中,@ComponentScan
默认会扫描 @SpringBootApplication
注解所在的类包及其子包,自动扫描这些包中的所有组件。如果需要更改扫描范围,可以通过 @ComponentScan
注解的 basePackages
属性来指定。
@SpringBootApplication
@ComponentScan(basePackages = "com.example.custom")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}
6. 执行命令行逻辑
在 Spring Boot 应用启动完成后,如果项目中实现了 CommandLineRunner
或 ApplicationRunner
接口,Spring Boot 会自动调用它们的 run()
方法。通过这两个接口,开发者可以在应用启动完成后执行一些初始化操作,如加载数据、检查环境等。
@Component
public class MyStartupRunner implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("Spring Boot Application has started!");}
}
7. 发布应用事件
Spring Boot 会在应用启动过程中发布一些重要的事件,如 ApplicationStartedEvent
、ApplicationReadyEvent
等。开发者可以通过监听这些事件来执行一些额外的任务。例如,在应用准备好接收请求时,可以执行一些后续初始化操作。
@Component
public class ApplicationListenerExample implements ApplicationListener<ApplicationReadyEvent> {@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {System.out.println("Application is ready to serve requests!");}
}

总结
Spring Boot 的启动原理通过自动化配置、内嵌式 Web 服务器、自动扫描组件和启动事件的处理,极大地简化了传统 Spring 应用的开发过程。开发者只需关注业务逻辑,Spring Boot 会自动处理配置和启动流程。通过其强大的自动配置功能和内嵌服务器,Spring Boot 提供了一种高效、简洁的方式来开发和部署应用程序,大大提升了开发效率并减少了配置的繁琐程度。
相关文章:
Spring Boot 的启动原理
Spring Boot 是由 Pivotal 团队发布的一个开源框架,它基于 Spring 框架,旨在简化企业级应用程序的开发过程。与传统的 Spring 项目相比,Spring Boot 提供了一种更加简洁、高效的方式来构建和部署应用程序。其核心理念是“约定优于配置”和“自…...
Oracle 19C RU补丁升级,从19.7to19.25 -单机
1. 环境信息: 角色 数据库 IP地址 数据库版本 数据库名称 源端 单实例 172.30.21.191 19.7 hfzcdb 2. 安装准备 用rman备份数据库,再备份下oracle目录: 命令: tar zavf oracle.tar /oracle 19.25版本关于19C的补丁内…...
Web day08 项目实战(2)
目录 查询员工: 在EmpController层: 在pojo层: 在EmpServiceImpl 层中: 在dao层: 新增员工: pojo层: EmpController层: 在EmpServiceImpl 层中: 在EmpMapper层: …...
生命周期(vue2和vue3的生命周期对比)有哪些?
Vue.js 提供了一套完整的数据驱动和组件化思想,其生命周期钩子是开发者理解组件行为的关键。以下是 Vue 2 和 Vue 3 中生命周期钩子的对比: Vue 2 生命周期钩子 创建阶段 beforeCreate:实例初始化之前调用,此时 data 和 methods …...
智慧信息发系统——控件磁吸
//鍙悜涓婂惛 function fun_鎺т欢纾佸惛_璁$畻(鐏典綋y,寮曞姏鍊�,閫夋嫨鍖哄煙,璁$畻鍧愭爣绫诲瀷) {const 灞忓箷椤圭洰 document.querySelectorAll(閫夋嫨鍖哄煙);var 璺濈鎴戞渶杩憏 0;var 鏈€杩戜竴娆″紩鍔� 0…...
【时间序列预测】基于PyTorch实现CNN_LSTM算法
文章目录 1. CNN_LSTM模型概述2. 网络结构3. 完整代码实现4.模型解析4.1 CNN层4.2 ReLU层4.3 MaxPooling层4.4 LSTM层4.5 输出层4.6 前向传播 5. 总结 在时间序列预测任务中,CNN(卷积神经网络)和LSTM(长短期记忆网络)是…...
Android环境搭建
Android环境搭建 第一步:安装 Homebrew 执行以下命令来安装 Homebrew: /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"检测是否安装成功: brew --version第二步:安装 No…...
HarmonyOS 5.0应用开发——Ability与Page数据传递
【高心星出品】 文章目录 Ability与Page数据传递Page向Ability传递数据Ability向Page传递数据 Ability与Page数据传递 基于当前的应用模型,可以通过以下几种方式来实现UIAbility组件与UI之间的数据同步。 使用EventHub进行数据通信:在基类Context中提供…...
【数据结构】顺序表
一、顺序表的基本概念 1.1 概念 顺序表是一种线性表的存储结构,其特点是:使用一段连续的存储空间存储线性表中的数据元素,通过数组实现,具有随机访问的能力。 可以把顺序表直接理解为数组,只不过这个数组里可以存各种类…...
光伏与储能软件有哪些?
随着技术的不断进步,光伏与储能的软件系统也层出不穷,为这一领域的发展提供了强有力的支持。 一、光伏设计软件 1、PVSyst 功能:这是一款全球广泛使用的光伏系统设计软件,支持光伏系统的模拟与设计,包括组件阵列、倾…...
AI周报(12.1-12.7)
AI应用-AI独立开发“小猫补光灯” 无论GitHub Copilot、Amazon CodeWhisperer,还是前面AI周报(6.23-6.29)Devv.ai,重在提高编码效率、提供编码补全和建议。小猫补光灯第一次让一个完全不会编程的产品经理,与AI协作&…...
windows 脚本批量管理上千台服务器实战案例
如果你们有接触服务器,都是知道服务器有BMC管理界面的,这几天我在做项目中,需要不断的开关机服务器,如果一两台服务器登录BMC界面重启服务器还好,如果服务器数量非常的庞大,成百上千台,我们不可…...
一级路由访问家里的二级路由设备 例如nas
家里升级千兆网,更换了光猫设备,家里走网线的话,只有100m速度,就直接用了光猫的无线,这次换的很顶,下载和打游戏也够用了,基本上没有网络波动。就客厅用了一个路由器,接了nas和摄像头…...
线程(二)——线程安全
如何理解线程安全: 多线程并发执行的时候,有时候会触发一些“bug”,虽然代码能够执行,线程也在工作,但是过程和结果都不符合我们的开发时的预期,所以我们将此类线程称之为“线程安全问题”。 例如ÿ…...
Altium Designer学习笔记 31 PCB布线优化_GND处理
基于Altium Designer 23学习版,四层板智能小车PCB 更多AD学习笔记:Altium Designer学习笔记 1-5 工程创建_元件库创建Altium Designer学习笔记 6-10 异性元件库创建_原理图绘制Altium Designer学习笔记 11-15 原理图的封装 编译 检查 _PCB封装库的创建Al…...
第四节、电机定角度转动【51单片机-TB6600驱动器-步进电机教程】
摘要:本节介绍用电机转动角度计算步骤,从而控制步进电机转角 一、 计算过程 1.1 驱动器接收一个脉冲后,步进电机转动一步,根据驱动器设置的细分值 计算一个脉冲对应电机转动的角度step_x s t e p x s t e p X … … ① step_{x…...
亚马逊云科技用生成式AI,向开发的复杂性动手了
生成式 AI、分布式扩展功能全面进化,还降价了。 同一天的发布,完全不同的方向。 今天凌晨,云计算巨头亚马逊云科技的 re:Invent 与大号创业公司 OpenAI 的发布「撞了车」。后者公布了一系列生成式 AI 应用,价格更贵、性能更强大&a…...
SharpDevelop IDE IViewContent.cs类
文件位置:IViewContent.cs /// <summary>/// IViewContent is the base interface for "windows" in the document area of SharpDevelop./// A view content is a view onto multiple files, or other content that opens like a document/// (e.…...
【工具变量】地级市城市全社会用电量数据(2006-2021年)
一、数据范围:覆盖中国300多个地级市 二、包含指标: 省份、地级市、年份、全社会用电量。 三、数据来源:国家电网查询数据。对于极大部分城市,国网售电量就是全社会用电量(往年的售电量和全社会用电量数据相同),此外…...
vue列表滚动动画效果
一、效果展示: 录屏2024-12-07 02.16.59 二、步骤: 1. 需要用<transition-group>包裹需要渲染的item列表 ⚠️注意:这里的:key"item.id",必须要用id之类的,不能用index <transition-group name&qu…...
33.5 remote实战项目之设计prometheus数据源的结构
本节重点介绍 : 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写入数据 准备工作 新建项目 prome_remote_read_write设计prometheus 数据源的结构初始化 项目要求 通过remote read读取prometheus中的数据通过remote write向prometheus中写…...
Ceph文件存储
Ceph文件存储1.概念:数据以文件的形式存储在存储介质上,每个文件都有一个唯一的文件名并存储在一个目录结构中。提供方便的文件访问接口,支持多种文件操作,如创建、删除、读取、写入、复制等。用于存储和管理个人文件,如文档、图片…...
力扣-图论-5【算法学习day.55】
目录 前言 习题 1.移除可疑的方法 后言 前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键…...
Linux-音频应用编程
ALPHA I.MX6U 开发板支持音频,板上搭载了音频编解码芯片 WM8960,支持播放以及录音功能!本章我们来学习 Linux 下的音频应用编程,音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升,但是笔者仅向大家介绍 Li…...
SQL复杂查询功能介绍及示例
文章目录 1. 多表连接(JOIN)功能介绍应用场景示例查询及初始表格customers 表(未查询前)orders 表(未查询前)INNER JOIN 示例LEFT JOIN 示例 2. 子查询(Subquery)功能介绍应用场景示…...
Python使用Selenium自动实现表单填写之蛇年纪念币蛇钞预约(附源码,源码有注释解析,已测试可用
Python实现纪念币预约自动填写表单 声明:本文只做技术交流,不可用代码为商业用途,文末有源码下载,已测试可用。 Part 1 配置文件改写(源码 有详细的注释说明 读取配置文件,自己组数据库,录入信息 配置文件 Part 2 主函数 每一期的xpath路径都不一样 所以需要提前去网站…...
快速掌握HTML
目录 1. HTML文件的基本结构* 前端开发工具搭建* vscode的三个插件* 编写第一个html代码* 快速生成代码框架 *html特殊字符2. 双标签2.1 标题标签 h12.2 段落标签 p2.3 格式化标签2.4 超链接标签 a2.5 表格标签2.6 列表标签1. 无序列表:ul标签( 快捷键:u…...
Linux 音频驱动实验
音频是我们最常用到的功能,音频也是 linux 和安卓的重点应用场合。I.MX6ULL 带有 SAI接口,正点原子的 I.MX6ULL ALPHA 开发板通过此接口外接了一个 WM8960 音频 DAC 芯片,本章我们就来学习一下如何使能 WM8960 驱动,并且通过 WM89…...
【分布式】Redis分布式缓存
一、什么是Redis分布式缓存 Redis分布式缓存是指使用Redis作为缓存系统来存储和管理数据的分布式方案。在分布式系统中,多台服务器共同对外提供服务,为了提高系统的性能和可扩展性,通常会引入缓存来减轻数据库的压力。Redis作为一种高性能的…...
几个Linux系统安装体验: 一些系统对比和使用记录
本文对一些系统做对比,并记录一些使用过程。 背景 本文所记录的内容,不保证绝对性,也不代表任何方的意见、意思、看法、观点。如有不适,权当笑料。 个人使用记录 centos7 centos7为笔者的主力系统,生产工具。虚拟机…...
c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序
高阶排序 1、快速排序 冒泡排序的升级算法 每次选择一个基准数,把小于基准数的放到基准数的左边,把大于基准数的放到基准数的右边,采用 “ 分治算法 ”处理剩余元素,直到整个序列变为有序序列。 最好和平均的复杂度:…...
特朗普画像
任务内容 Description 特朗普当选了,网上流传着很多段子,也出了特朗普的头像。有人说,特朗普 的头像像一团云。所以今年马云去了美国和特朗普谈中美企业的发展。那么你能帮 忙打印出特朗普的头像吗? 抽象派认为,特朗普…...
torch如何产生3d随机变形场(DVFs)
随机变形场(Deformation Vector Fields, DVFs)是一种在图像处理和计算机视觉中常用的技术,用于生成变形后的图像或增强数据集的多样性。它通过创建一个在空间中定义的位移场,以实现图像的随机变形。以下是生成随机DVFs的主要步骤和方法: 1. 随机噪声生成 随机变形场的基…...
【PlantUML系列】用例图(三)
目录 一、组成部分 二、典型案例 一、组成部分 参与者(Actors):使用关键字 actor 后跟参与者的名称。用例(Use Cases):使用关键字 usecase 后跟用例的名称和编号(可选)。系统边界…...
PHP使用RabbitMQ(正常连接与开启SSL验证后的连接)
代码中包含了PHP在一般情况下使用方法和RabbitMQ开启了SSL验证后的使用方法(我这边消费队列是使用接口请求的方式,每次只从中取出一条) 安装amqp扩展 PHP使用RabbitMQ前,需要安装amqp扩展,之前文章中介绍了Windows环…...
距离与AoA辅助的三维测距算法(适用于四个基站的情况的单点定位),MATLAB代码
本MATLAB 代码实现了一个基于LOS/NLOS混合环境的单点定位系统,主要用于估计目标物体的单点位 文章目录 代码运行结果源代码代码功能概述主要步骤分析初始化部分 绘图与输出 代码运行结果 定位结果如下: 命令行的坐标和误差输出: 部分代码…...
计算机网络原理之HTTP与HTTPS
一、前言 为了理解HTTP,我们有必要事先了解一下TCP/IP协议簇。 通常我们使用的网络(包括互联网)是在TCP/IP协议簇的基础上运作的。而HTTP属于它内部的一个子集。 计算机与网络设备要相互通信,双方必须基于相同的方法。比如&#…...
使用did包进行多期DID分析
本例中,样例数据来自 Callaway 和 Sant’Anna (2020),研究问题是各州提高最低工资对县级青少年就业率影响。 样例数据集包含 2003 年至 2007 年 500 个县级青少年就业率的数据,其中一些州在 2004 年首次接受治疗,也有一些在 2006…...
Windows宝塔面板下IIS环境如何部署SSL证书?
Windows宝塔面板下IIS环境如何部署SSL证书? 平时服务器linux宝塔用的较多,所以linux系统宝塔,如何部署SSL证书还是比较熟悉,今天遇到一个windows的部署SSL证书,还是头一次,所以记录一下,以防忘…...
【MySQL】函数
函数 1.日期函数2.字符串函数3.数学函数4.其他函数 点赞???收藏???关注??? 你的支持是对我最大的鼓励,我们一起努力吧??? 在mysql中其实内置了很多的函数操作,这些函数可以让我们在数据统计的时候以及查表的时候进行各自各样的操作。 1.日…...
面试复盘 part 02·1202-1207 日
作品集讲述部分 分析反思 作品集讲述部分,视觉讲述部分需要更换,需要换成其他视觉相关的修改 具体话术 这是一个信息展示优化方案,用户为财务,信息区分度不足,理解成本较高,因此选择需要降低理解成本。…...
RISC-V 汇编语言
安装RISCV工具链 riscv-gnu-toolchain工具链和模拟器安装记录 - 知乎 (zhihu.com) riscv-gnu-toolchain工具链分elf-gcc、linux-gnu-gcc两个版本,以及对应的32位和64位版本。两个版本的主要区别是: riscv32-unknown-elf-gcc、riscv64-unknown-elf-gcc…...
MySQL Explain 指南
MySQL Explain 指南 idselect_typetablepartitionstypepossible_keyskeykeylenrefrowsfilteredExtra 使用 explain 执行 DML 语句时,数据不会发生变化。explain 的结果可能包含多行数据,每行对应一个表。若涉及 union 操作,MySQL 会创建临时表…...
keil报错---connection refused due to device mismatch
解决办法如下: 记得改成1 把Enable取消...
ubuntu下的chattts 学习4:Advanced Usage
源码 import ChatTTS import torch import torchaudiochat ChatTTS.Chat() chat.load(compileFalse) # Set to True for better performance ################################### # Sample a speaker from Gaussian.rand_spk chat.sample_random_speaker() print(rand_spk)…...
Ubuntu桌面突然卡住,图形界面无反应
1.可能等待几分钟,系统会自动反应过来。你可以选择等待几分钟。 2.绝大多数情况系统是不会反应过来的,这时候可以进入tty终端直接注销用户。 (1)Ubuntu有6个tty终端,按住CtrlAltF1可以进入tty1终端,(同理CtrlAltF2&a…...
毕设记录_论文阅读(动磁式音圈电机的开发与应用)_20241207
前言 提醒: 文章内容为方便作者自己后日复习与查阅而进行的书写与发布,其中引用内容都会使用链接表明出处(如有侵权问题,请及时联系)。 其中内容多为一次书写,缺少检查与订正,如有问题或其他拓展…...
我有一个Python项目,已经用docker打包镜像也push了,k8s怎么部署呢?
要在Kubernetes (k8s) 部署你的Python项目,你需要创建一系列的Kubernetes资源定义文件(通常是以.yaml为扩展名),这些文件描述了你希望在集群中运行的应用程序。以下是部署的基本步骤: 1. **准备Docker镜像**࿱…...
GAN(生成对抗网络)原理与目标函数
GAN(生成对抗网络)原理与目标函数 什么是 GAN? GAN 是一种生成模型,全名是 生成对抗网络 (Generative Adversarial Network)。它由两个部分组成: 生成器 (Generator, G):负责生成“假数据”。判别器 (Di…...
[Java]项目入门
这篇简单介绍一些入门的有关项目和行业的知识,并带着实现一个小项目。便于已经编程入门的各位准备进阶到下一个阶段。 先大致地介绍,一个完整的项目(不看客户端、服务端的分类)基本可以划分为三部分: 1.前端。比如你现在看到的CSDN页面就是一…...