深入理解 Spring Boot 应用的生命周期:从启动到关闭的全流程解析
引言
Spring Boot 是当今 Java 开发中最流行的框架之一,它以简化配置和快速开发著称。然而,要真正掌握 Spring Boot,理解其应用的生命周期是至关重要的。本文将深入探讨 Spring Boot 应用的生命周期,从启动到关闭的各个阶段,并介绍如何通过扩展点自定义应用行为。
1. Spring Boot 应用的生命周期概述
Spring Boot 应用的生命周期可以分为以下三个阶段:
- 启动阶段:从应用启动到完全运行。
- 运行阶段:应用正常运行,处理请求和执行业务逻辑。
- 关闭阶段:从接收到关闭信号到应用完全终止。
每个阶段都有其独特的扩展点和事件,开发者可以通过这些机制对应用的行为进行精细控制。
2. 启动阶段
启动阶段是 Spring Boot 应用生命周期的第一个阶段,主要包括以下步骤:
2.1 启动类加载
Spring Boot 应用的入口是带有 @SpringBootApplication 注解的主类。通过调用 SpringApplication.run() 方法,应用启动流程正式开始。
2.2 初始化 Spring 上下文
Spring Boot 会初始化 ApplicationContext,加载配置文件、Bean 定义以及其他必要的资源。
2.3 执行 ApplicationRunner 和 CommandLineRunner
如果应用中有实现 ApplicationRunner 或 CommandLineRunner 接口的 Bean,它们会在应用启动后执行。这两个接口非常适合用于执行一些初始化任务。
@Component
public class MyApplicationRunner implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println("Application started with arguments: " + args.getOptionNames());}
}
2.4 启动内嵌的 Web 服务器
如果应用是一个 Web 应用,Spring Boot 会启动内嵌的 Tomcat、Jetty 或 Undertow 服务器。
2.5 应用启动完成
当应用完全启动并准备好接收请求时,Spring Boot 会触发 ApplicationReadyEvent 事件。
3. 运行阶段
在运行阶段,应用处于正常工作状态,处理用户请求、执行业务逻辑等。开发者可以通过以下方式扩展和监控应用行为:
3.1 自定义健康检查
通过实现 HealthIndicator 接口,开发者可以自定义应用的健康检查逻辑。
@Component
public class MyHealthIndicator implements HealthIndicator {@Overridepublic Health health() {return Health.up().withDetail("Custom", "Everything is OK").build();}
}
3.2 自定义性能指标
使用 Micrometer 或 Spring Boot Actuator 提供的 API,开发者可以自定义应用的性能指标。
4. 关闭阶段
关闭阶段是 Spring Boot 应用生命周期的最后一个阶段,主要包括以下步骤:
4.1 接收关闭信号
当应用接收到关闭信号(例如,通过 SIGTERM 或 SIGINT),Spring Boot 开始关闭流程。
4.2 触发 ContextClosedEvent 事件
Spring 上下文关闭时,会触发 ContextClosedEvent 事件。
4.3 销毁 Bean
Spring 容器会调用所有 Bean 的 @PreDestroy 方法或实现 DisposableBean 接口的 destroy() 方法。
@Component
public class MyBean {@PreDestroypublic void cleanup() {System.out.println("Bean is being destroyed...");}
}
4.4 关闭内嵌的 Web 服务器
如果应用是一个 Web 应用,内嵌的服务器会被关闭。
4.5 应用完全关闭
应用进程终止。
5. Spring Boot 生命周期中的关键扩展点
Spring Boot 提供了多个扩展点,允许开发者在应用生命周期的不同阶段执行自定义逻辑。
5.1 启动阶段扩展点
ApplicationRunner和CommandLineRunner:在应用启动后执行自定义逻辑。ApplicationListener:监听 Spring Boot 的生命周期事件。
5.2 运行阶段扩展点
- 自定义健康检查:通过实现
HealthIndicator接口。 - 自定义性能指标:使用 Micrometer 或 Spring Boot Actuator。
5.3 关闭阶段扩展点
@PreDestroy注解:在 Bean 销毁前执行清理逻辑。- 实现
DisposableBean接口:在 Bean 销毁时执行清理逻辑。 - 监听
ContextClosedEvent事件:在 Spring 上下文关闭时执行自定义逻辑。
6. Spring Boot 生命周期中的事件
Spring Boot 在生命周期中会发布一系列事件,开发者可以通过监听这些事件来执行自定义逻辑。常见的事件包括:
ApplicationStartingEvent:应用启动时触发。ApplicationEnvironmentPreparedEvent:环境准备完成后触发。ApplicationContextInitializedEvent:应用上下文初始化完成后触发。ApplicationPreparedEvent:应用准备完成后触发。ApplicationStartedEvent:应用启动后触发。ApplicationReadyEvent:应用完全启动并准备好接收请求时触发。ContextClosedEvent:应用上下文关闭时触发。
7. 总结
Spring Boot 应用的生命周期涵盖了从启动到关闭的整个过程。通过理解生命周期的各个阶段及其扩展点,开发者可以更好地控制应用的行为,优化启动性能,并在适当的时候释放资源。无论是通过 ApplicationRunner 执行初始化任务,还是通过 @PreDestroy 清理资源,Spring Boot 都提供了丰富的机制来满足开发者的需求。
掌握 Spring Boot 的生命周期,不仅有助于开发高效、稳定的应用,还能提升对框架的深入理解。希望本文能为你提供有价值的参考,助你在 Spring Boot 开发中游刃有余!

参考资料
- Spring Boot 官方文档
- Spring Framework 官方文档
相关文章:
深入理解 Spring Boot 应用的生命周期:从启动到关闭的全流程解析
引言 Spring Boot 是当今 Java 开发中最流行的框架之一,它以简化配置和快速开发著称。然而,要真正掌握 Spring Boot,理解其应用的生命周期是至关重要的。本文将深入探讨 Spring Boot 应用的生命周期,从启动到关闭的各个阶段&…...
【算法笔记】图论基础(一):建图、存图、树和图的遍历、拓扑排序、最小生成树
目录 何为图论图的概念 图的一些基本概念有向图和无向图带权图连通图和非连通图对于无向图对于有向图 度对于无向图对于有向图一些结论 环自环、重边、简单图、完全图自环重边简单图 稀疏图和稠密图子图、生成子图同构 图的存储直接存边邻接矩阵存边邻接表存边链式前向星存边 图…...
SpringMVC 请求与响应处理详解
引言 在 Java Web 开发中,SpringMVC 作为 Spring 框架的重要模块,提供了强大的请求和响应处理机制。本文将深入探讨 SpringMVC 中请求和响应的处理方式,结合实际案例,帮助开发者更好地理解和应用这些功能。 一、SpringMVC 请求处…...
【python】requests 爬虫高效获取游戏皮肤图
1. 引言 在当今的数字时代,游戏已经成为许多人生活中不可或缺的一部分。而游戏中的皮肤,作为玩家个性化表达的重要方式,更是受到了广泛的关注和喜爱。然而,对于许多玩家来说,获取游戏皮肤往往需要花费大量的时间和精力…...
(UI自动化测试web端)第二篇:元素定位的方法_css定位之ID选择器
看代码里的【find_element_by_css_selector( )】( )里的表达式怎么写? 文章介绍了第一种写法id选择器,其实XPath元素定位要比CSS好用,原因是CSS无法使用下标(工作当中也是常用的xpath),但CSS定位速度比XPat…...
23种设计模式-代理(Proxy)设计模式
代理设计模式 🚩什么是代理设计模式?🚩代理设计模式的特点🚩代理设计模式的结构🚩代理设计模式的优缺点🚩代理设计模式的Java实现🚩代码总结🚩总结 🚩什么是代理设计模式…...
【react18】react项目使用mock模拟后台接口
前后端分离项目,后端还没有接口的时候,前端可以使用mockjs的技术实行假数据的模拟。这里使用的是mock的库msw实现这个业务. MSW msw是mock的工具,官网地址是在这里 使用步骤 1.安装msw npm install mswlatest --save-dev2.新建存放mock接…...
Excel新增的函数
常用函数 XLOOKUP 1、普通查找 2、屏蔽错误值 3、横向查找 4、通配符查找 ?:代表任意单个字符 *:代表任意多个字符 5、反向查找 6、多条件查找 7、查找多列数据 8、查找最后一个 IFS MINIFS MAXIFS 文本函数 TEXTSPLIT、TEXTJOIN、CONCAT、 TEXTBEFORE、TEXTAFT…...
Windows下VSCode的安装
前言 VSCode的安装看起来平平无奇,但也不是轻轻松松的。笔者将最新的Windows下安装VSCode,以及运行最简单的C程序的过程记录下来,供后续的自己和大家参考。 一、官网下载安装包 Visual Studio Code - Code Editing. Redefined 二、安装 直接…...
django入门教程之templates和static资源【五】
使用app01子应用举例说明模板的使用。templates官方文档。 templates完整流程认知 第一步,在settings.py中注册app01子应用。 第二步,在app01目录下,新建templates和static目录,用于存放模板文件和资源文件。目录结构如下&#…...
Vue 中directive的钩子函数(bind、inserted 等)的作用及使用场景
大白话Vue 中directive的钩子函数(bind、inserted 等)的作用及使用场景。 在 Vue 里,指令(directive)是个超实用的东西,它能让你在不改动组件逻辑的情况下,给 HTML 元素添加一些特殊的行为。Vu…...
【区块链安全 | 第一篇】密码学原理
文章目录 1.哈希函数1.1 哈希函数的性质1.2 常见哈希算法1.3 Merkle Tree(默克尔树)1.4 HMAC(哈希消息认证码) 2. 公钥密码学2.1 对称加密 vs 非对称加密2.2 RSA 算法2.3 ECC(椭圆曲线密码学)2.4 Diffie-He…...
Linux安装MySQL数据库并使用C语言进行数据库开发
目录 一、前言 二、安装VMware运行Ubuntu 1.安装VMware 2.使用VMware打开Ubuntu 三、配置VMware使用网卡 1.添加NAT网卡 四、Linux下安装MySQL数据库 五、安装MySQL开发库 六、演示代码 sql_connect.c sql_connect.h main.c中数据库相关代码 结尾 一、前言 由于最…...
2024年MathorCup数学建模A题移动通信网络中PCI规划问题解题全过程文档加程序
2024年第十四届MathorCup高校数学建模挑战赛 A题 移动通信网络中PCI规划问题 原题再现: 物理小区识别码(PCI)规划是移动通信网络中下行链路层上,对各覆盖小区编号进行合理配置,以避免PCI冲突、PCI混淆以及PCI模3干扰等现象。PCI规划对于减少…...
伯努利分布和二项分布学习笔记
目录 1. 伯努利分布1.1定义1.2概率质量函数1.3数学期望与方差1.4应用示例 2. 二项分布2.1定义2.1概率质量函数2.2数学期望与方差2.3性质与图形 3. 伯努利分布与二项分布的关系4. 总结 1. 伯努利分布 伯努利分布(Bernoulli Distribution),又称…...
Redis实战常用二、缓存的使用
一、什么是缓存 在实际开发中,系统需要"避震器",防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪. 这在实际开发中对企业讲,对产品口碑,用户评价都是致命的。所以企业非常重视缓存技术; 缓存(Cache):就是数据交换的缓冲区&…...
G口服务器和普通服务器之间的区别
今天小编主要来为大家介绍一下G口服务器和普通服务器之间的区别! 首先,从硬件配置上看,普通服务器通常都会配备中央处理器、内存和硬盘等基本的硬件配置,能够适用于各种应用程序和服务;G口服务器除了基础的硬件配置还增…...
通过国内源在Ubuntu20.0.4安装repo
国内三大免费源: 清华大学:清华大学开源软件镜像站 | Tsinghua Open Source Mirror中国科技大学:USTC Open Source Software Mirror阿里云:阿里巴巴开源镜像站-OPSX镜像站-阿里云开发者社区 repo只在清华源网站里搜到:…...
多维动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题
多维动态规划 不同路径 https://leetcode.cn/problems/unique-paths/ 核心思路 比较简单 f[i][j] f[i - 1][j] f[i][j - 1] ; 示例代码 class Solution {public int uniquePaths(int n, int m) {int[][] f new int[n][m];for (int i 0; i < n; i)f[i][0] 1;for…...
《Java到Go的平滑转型指南》
文章目录 **文章摘要****核心主题****关键内容提炼****决策者行动清单****核心结论** **第一章:转型决策:为什么要从Java转向Go?****1.1 性能对比:GC机制与并发模型差异****GC机制对比****并发模型基准测试** **1.2 开发效率&…...
【软件测试】:软件测试实战
1. ⾃动化实施步骤 1.1 编写web测试⽤例 1.2 ⾃动化测试脚本开发 common public class AutotestUtils {public static EdgeDriver driver;// 创建驱动对象public static EdgeDriver createDriver(){// 驱动对象已经创建好了 / 没有创建if( driver null){driver new EdgeDr…...
SpringMVC 请求处理
SpringMVC 请求处理深度解析:从原理到企业级应用实践 一、架构演进与核心组件协同 1.1 从传统Servlet到前端控制器模式 SpringMVC采用前端控制器架构模式,通过DispatcherServlet统一处理请求,相比传统Servlet的分散处理方式,实…...
unittest自动化测试实战
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 为什么要学习unittest 按照测试阶段来划分,可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程…...
leetcode3.无重复字符的最长字串
采用滑动窗口方法 class Solution { public:int lengthOfLongestSubstring(string s) {int ns.size();if(n0)return 0;int result0;unordered_set<char> set;set.insert(s[0]);for(int i0,j0;i<n;i){while(j1<n&&set.find(s[j1])set.end()){set.insert(s[…...
Android Compose 框架派生状态(derivedStateOf、rememberCoroutineScope)深入剖析(十五)
一、引言 在 Android 开发领域,高效的状态管理对于构建响应式、高性能的应用程序至关重要,在 Jetpack Compose 中,derivedStateOf 和 rememberCoroutineScope 这两个与派生状态相关的特性在状态管理方面发挥着关键作用。派生状态允许我们根据…...
3.25-2request库
request库 一、介绍request库 (1)requests是用python语言编写的简单易用的http库,用来做接口测试的库; (2)接口测试自动化库有哪些? requests、urllib 、urllib2、urllib3、 httplib 等&…...
《破解老龄化的智能密钥:机器人四维战略与未来养老生态》
一、引言:老龄化社会与智能机器人的必然性 全球老龄化趋势与老年人核心需求(健康管理、生活辅助、心理陪伴、安全保障) 全球正面临着严峻的老龄化挑战。根据联合国发布的数据,全球60岁及以上人口数量在过去几十年中持续增长&…...
Docker-Volume数据卷详讲
Docker数据卷-Volume 一:Volume是什么,用来做什么的 当删除docker容器时,容器内部的文件就会跟随容器所销毁,在生产环境中我们需要将数据持久化保存,就催生了将容器内部的数据保存在宿主机的需求,volume …...
SpringMVC 配置
一、MVC 模式简介 在软件开发的广袤天地中,MVC 模式宛如一座明亮的灯塔,指引着开发者构建高效、可维护的应用程序。Spring MVC 作为基于 Spring 框架的重要 web 开发模块,更是将 MVC 模式的优势发挥得淋漓尽致,堪称 Servlet 的强…...
Python 3.8 Requests 爬虫教程(2025最新版)
遵守网站的爬虫规则、避免爬取敏感信息、保护个人隐私! 一、环境配置与基础验证 # 验证 Python 版本(需 ≥3.8) import sys print(sys.version) # 应输出类似 3.8.12 的信息# 安装 requests 库(若未安装) # 命令行执…...
