Spring Boot 生命周期与核心扩展点全解析(含实操案例)

在Spring Boot开发中,理解应用的生命周期是实现优雅启动、资源管理与故障处理的关键。不同于传统Spring框架需要繁琐的XML配置,Spring Boot通过自动配置简化了开发流程,但其生命周期的底层逻辑仍延续并增强了Spring的核心机制。本文将从“生命周期阶段划分”“核心扩展点原理”“实操案例”三个维度,带大家彻底掌握Spring Boot的生命周期管理。

一、Spring Boot 生命周期核心阶段

Spring Boot应用的生命周期本质是“容器启动→Bean创建→应用运行→容器关闭”的完整流程,可细分为4个核心阶段,每个阶段都对应着特定的底层操作与扩展机会。

1. 启动准备阶段(Startup Preparation)

此阶段为应用启动做基础配置,核心是初始化“环境”与“监听器”,具体流程如下:

  1. 执行SpringApplication.run()方法,首先创建SpringApplication实例;
  2. 初始化ApplicationContextInitializer(应用上下文初始化器)和ApplicationListener(应用监听器),从类路径下的META-INF/spring.factories中加载自动配置类;
  3. 准备Environment(环境对象),包含系统属性、环境变量、配置文件(application.yml/properties)等信息,并完成配置文件的解析与绑定。

关键特征:此时ApplicationContext(应用上下文)尚未创建,仅完成基础环境搭建,适合做全局配置的预处理。

2. 容器初始化阶段(Container Initialization)

此阶段是Spring Boot的核心,负责创建ApplicationContext(应用上下文)并初始化Bean,流程可拆解为:

  1. 创建ApplicationContext实例(如AnnotationConfigServletWebServerApplicationContext,根据Web类型自动选择);
  2. 调用ApplicationContextInitializerinitialize()方法,对应用上下文进行预处理(如添加自定义BeanDefinition);
  3. 注册ApplicationListener到应用上下文,监听后续的生命周期事件;
  4. 加载BeanDefinition:扫描指定包下的@Component@Service等注解类,解析自动配置类(@EnableAutoConfiguration)中的Bean;
  5. 刷新应用上下文(refresh()方法):这是Spring的核心方法,包含Bean的实例化、属性注入(DI)、初始化方法执行等关键步骤。

关键特征:Bean的创建与依赖注入在此阶段完成,是扩展点最集中的阶段。

3. 应用运行阶段(Application Running)

容器初始化完成后,应用进入稳定运行阶段:

  1. 对于Web应用(如Spring MVC、Spring WebFlux),会启动嵌入式服务器(Tomcat、Jetty等),监听指定端口接收请求;
  2. 应用上下文处于“活跃”状态,Bean可正常提供服务(如处理HTTP请求、执行定时任务等);
  3. 此阶段可通过监听器或自定义组件监控应用状态(如健康检查、指标收集)。

关键特征:应用对外提供服务,生命周期相对稳定,扩展点主要集中在状态监控与事件响应。

4. 容器关闭阶段(Container Shutdown)

当应用收到关闭信号(如Ctrl+C、kill命令、容器编排平台的停止指令)时,进入关闭阶段:

  1. 发布ContextClosedEvent事件,触发相关监听器的回调;
  2. 调用单例Bean的destroy()方法(或@PreDestroy注解方法),释放资源(如关闭数据库连接池、断开消息队列、销毁线程池等);
  3. 关闭嵌入式服务器,停止接收新请求,并处理剩余的请求(优雅关闭);
  4. 销毁应用上下文,释放所有Bean资源。

关键特征:核心是“优雅释放资源”,避免内存泄漏或数据不一致,是保障应用稳定性的重要阶段。

二、Spring Boot 核心扩展点解析(附实操)

Spring Boot在生命周期的各个阶段提供了丰富的扩展点,允许开发者在不修改框架源码的情况下,自定义流程逻辑。以下是常用扩展点的原理与实操案例,所有案例基于Spring Boot 2.7.x版本。

1. 启动准备阶段扩展:ApplicationContextInitializer

作用

在应用上下文(ApplicationContext)创建前,对其进行预处理(如添加自定义配置、注册BeanDefinition等),常用于框架级别的初始化。

实现步骤
  1. 实现ApplicationContextInitializer接口,重写initialize()方法;
  2. 注册扩展类:通过SpringApplication.addInitializers()META-INF/spring.factories配置;
  3. 触发时机:在ApplicationContext创建后、刷新前执行。
实操案例:添加自定义系统属性
// 1. 实现扩展类
public class CustomContextInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {@Overridepublic void initialize(ConfigurableApplicationContext applicationContext) {// 往环境中添加自定义属性ConfigurableEnvironment environment = applicationContext.getEnvironment();Map<String, Object> customProps = new HashMap<>();customProps.put("app.custom.version", "v1.0.0");customProps.put("app.custom.env", "dev");// 将自定义属性添加到环境中(优先级低于配置文件)environment.getPropertySources().addLast(new MapPropertySource("customPropertySource", customProps));System.out.println("ApplicationContextInitializer:已添加自定义系统属性");}
}// 2. 注册扩展类(两种方式任选其一)
// 方式1:在启动类中手动注册
@SpringBootApplication
public class LifecycleDemoApplication {public static void main(String[] args) {SpringApplication application = new SpringApplication(LifecycleDemoApplication.class);// 添加自定义Initializerapplication.addInitializers(new CustomContextInitializer());application.run(args);}
}// 方式2:通过META-INF/spring.factories配置(推荐,解耦)
// 在resources下创建META-INF/spring.factories,添加如下内容:
org.springframework.context.ApplicationContextInitializer=\
com.example.lifecycle.extension.CustomContextInitializer
验证

启动应用后,可通过@Value注入自定义属性,或在Environment中获取:

@RestController
public class TestController {@Value("${app.custom.version}")private String appVersion;@GetMapping("/version")public String getVersion() {return "应用版本:" + appVersion; // 输出:应用版本:v1.0.0}
}

2. 容器初始化阶段扩展:Bean初始化相关扩展

此阶段的扩展点主要围绕Bean的创建与初始化,常用的有@PostConstructInitializingBeanBeanPostProcessor

(1)@PostConstruct:Bean初始化方法注解
作用

在Bean的属性注入完成后,执行自定义初始化逻辑(如初始化缓存、加载配置),是最常用的Bean初始化方式。

原理

由JSR-250规范定义,Spring通过CommonAnnotationBeanPostProcessor解析该注解,在Bean的afterPropertiesSet()方法前执行。

实操案例
@Component
public class UserService {// 模拟属性注入@Autowiredprivate UserDao userDao;// 初始化方法:在属性注入后执行@PostConstructpublic void init() {System.out.println("UserService:@PostConstruct初始化,加载用户缓存");// 模拟初始化逻辑userDao.loadCache();}
}
(2)InitializingBean:Bean初始化接口
作用

@PostConstruct类似,通过实现接口方法定义Bean的初始化逻辑,优先级低于@PostConstruct@PostConstruct先执行)。

实操案例
@Component
public class OrderService implements InitializingBean {@Autowiredprivate OrderDao orderDao;@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("OrderService:InitializingBean初始化,初始化订单队列");// 模拟初始化逻辑orderDao.initQueue();}
}
执行顺序验证

若一个Bean同时使用@PostConstructInitializingBean

@Component
public class ProductService implements InitializingBean {@PostConstructpublic void postConstructInit() {System.out.println("ProductService:@PostConstruct执行");}@Overridepublic void afterPropertiesSet() throws Exception {System.out.println("ProductService:InitializingBean执行");}
}
// 启动后输出顺序:
// ProductService:@PostConstruct执行
// ProductService:InitializingBean执行
(3)BeanPostProcessor:Bean后置处理器
作用

在所有Bean的初始化前后执行自定义逻辑,可对Bean进行增强(如AOP代理、属性修改),是Spring AOP、事务管理等功能的底层基础。

原理
  • postProcessBeforeInitialization():在Bean的初始化方法(@PostConstructafterPropertiesSet())执行前调用;
  • postProcessAfterInitialization():在Bean的初始化方法执行后调用。
实操案例:给所有Bean添加自定义标记
// 实现BeanPostProcessor接口
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {// Bean初始化前执行@Overridepublic Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {// 给所有以"Service"结尾的Bean添加标记if (beanName.endsWith("Service")) {System.out.println("BeanPostProcessor(前):" + beanName + ",准备初始化");}return bean; // 必须返回Bean对象,否则Bean会丢失}// Bean初始化后执行@Overridepublic Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {if (beanName.endsWith("Service")) {System.out.println("BeanPostProcessor(后):" + beanName + ",初始化完成");}return bean;}
}
执行效果

启动应用后,控制台会输出:

BeanPostProcessor(前):userService,准备初始化
UserService:@PostConstruct初始化,加载用户缓存
BeanPostProcessor(后):userService,初始化完成
BeanPostProcessor(前):orderService,准备初始化
OrderService:InitializingBean初始化,初始化订单队列
BeanPostProcessor(后):orderService,初始化完成

3. 应用运行/关闭阶段扩展:ApplicationListener

作用

监听Spring Boot生命周期中的事件(如启动完成、关闭事件),在特定事件触发时执行自定义逻辑(如启动后打印日志、关闭前释放资源)。

核心事件(按生命周期顺序)
事件名称 触发时机 作用场景
ApplicationStartingEvent 应用启动开始(run()方法刚执行) 初始化日志、注册监听器
ApplicationEnvironmentPreparedEvent 环境(Environment)准备完成 修改配置、添加环境变量
ApplicationContextInitializedEvent 应用上下文创建并初始化完成 预处理应用上下文
ApplicationReadyEvent 应用启动完成,可对外提供服务 打印启动成功日志、发送告警通知
ContextClosedEvent 应用上下文关闭前 释放资源、关闭连接池
实操案例1:监听启动完成事件
// 方式1:实现ApplicationListener接口
@Component
public class StartupCompleteListener implements ApplicationListener<ApplicationReadyEvent> {@Overridepublic void onApplicationEvent(ApplicationReadyEvent event) {// 获取应用上下文与环境信息ConfigurableApplicationContext context = event.getApplicationContext();</

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/100252.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/100252.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

69-SQLite应用

1. SQLite操作 1.1了解数据库1.2 操作数据库步骤# -*- coding: utf-8 -*- """ Project : 01-python-learn File : 03_SQLite3添加数据.py IDE : PyCharm Author : 刘庆东 Date : 2025/9/15 14:05 """ # 1. 导入模块 import sqlite3 …

Nginx - 正向vs反向代理

参考: https://blog.csdn.net/william_n/article/details/127387009 AI问答​​ Nginx 正向代理 vs 反向代理详解​​ ​​1. 正向代理&#xff08;Forward Proxy&#xff09;​​ ​​定义​​ ​​客户端主动配置​​的代理服务器&#xff0c;代表客户端向外部服务器发送请…

装饰器模式在Spring中的案例

设计模式-装饰器模式 装饰器模式所解决的问题是&#xff0c;在不改变原来方法代码的情况下对方法进行修饰&#xff0c;从而丰富方法功能。 Spring架构中的装饰器模式 在Spring架构中&#xff0c;以线程池进行举例。 线程池 线程池是一个对线程集中管理的对象&#xff0c;集中管…

云原生与 AI 驱动下的数据工程新图景——解读 DZone 2025 数据工程趋势报告【附报告下载】

在 AI 技术从“实验性”走向“企业级落地”的关键阶段&#xff0c;数据工程作为底层支撑的重要性愈发凸显。近日&#xff0c;DZone 发布的《2025 数据工程趋势报告》&#xff08;Scaling Intelligence with the Modern Data Stack&#xff09;通过对全球 123 位 IT 专业人士的调…

9.5 机器翻译与数据集

语言模型是自然语言处理的关键&#xff0c;而机器翻译是语言模型最成功的基准测试&#xff0c;因为机器翻译正是将输入序列转换成输出序列的序列转换模型的核心问题。序列转码模型在各类现代人工智能应用中国呢发挥着至关重要的作用&#xff0c;因此我们将其作为本章剩余部分和…

Linux 内核镜像与启动组件全解析:从 vmlinux 到 extlinux.conf

&#x1f9e0; Linux 内核镜像与启动组件全解析&#xff1a;从 vmlinux 到 extlinux.conf 在嵌入式 Linux 系统中&#xff0c;启动流程涉及多个关键文件和机制。不同的镜像格式和配置文件承担着不同的职责&#xff0c;从内核编译到 bootloader 加载&#xff0c;再到系统启动。本…

【系统分析师】2024年下半年真题:论文及解题思路

更多内容请见: 备考系统分析师-专栏介绍和目录 文章目录 试题一:论devops在企业信息系统开发中的应用 试题二:论系统业务流程分析方法及应用 试题三:论软件测试方法及应用 试题四:论信息系统运维管理 试题一:论devops在企业信息系统开发中的应用 1、概要叙述你参与管理和…

AI GEO 实战:借百度文小言优化,让企业名称成搜索热词

在当今数字化浪潮中&#xff0c;企业的线上曝光度和搜索可见性至关重要。百度作为国内占据主导地位的搜索引擎&#xff0c;其推出的大模型文小言蕴含着巨大的潜力。通过巧妙运用 AI GEO&#xff08;生成式引擎优化&#xff09;策略&#xff0c;企业完全有可能让自己的公司名称成…

文件操作知识点总结

目录 1.为什么使用文件 2.什么是文件&#xff1f; 2.1 程序文件 2.2 数据文件 2.3 文件名 3.二进制文件和文本文件 4.文件的打开和关闭 4.1 流和标准流 4.1.1 流 4.1.2 标准流 4.2 文件指针 4.3 文件的打开和关闭 4.3.1 fopen函数 4.3.2 fclose函数 5.文件的顺序…

oracle认证有哪几种?如何选择

Oracle&#xff08;甲骨文&#xff09;不仅是全球领先的数据库软件巨头&#xff0c;更是企业级数据管理的代名词&#xff0c;获得Oracle认证&#xff0c;证明可从事Oracle数据库服务器的数据操作和管理等工作。下面给大家详细其主要认证类型及其在职业发展中的含金量&#xff0…

AppTest邀请测试测试流程

相比AppGallery邀请测试&#xff0c;AppTest邀请测试具备以下全新能力&#xff1a;若您同时发布了多个测试版本&#xff0c;AppTest支持测试版本自动升级到最新的测试版本。您可以选择将当前最新在架版本的应用介绍截图展示给测试人员&#xff0c;视觉效果更好&#xff0c;提升…

硬件 - oring多电源切换

目录 一、ORing电路 1.1 ORING 电路 1.2 ORING 电路关键部分 二、多电源切换 2.1 主要思路 2.2 适用场景 一、ORing电路 1.1 ORING 电路 中文常称 “或环电路” 或 “并联冗余电路”是一种电源并联冗余拓扑结构 核心功能&#xff1a;将多路独立电源的输出 “并联整合”&a…

Qt多语言翻译实战指南:常见陷阱与动态切换解决方案

问题背景 在Qt项目国际化过程中&#xff0c;开发者经常会遇到各种翻译逻辑问题&#xff0c;特别是需要实现运行时语言动态切换功能时。一个典型场景是&#xff1a;程序默认英文显示&#xff0c;加载中文翻译文件后界面变为中文&#xff0c;但再次切换回英文时却失败。本文将深入…

机器人要增加力矩要有那些条件和增加什么

机器人要增加力矩要有那些条件和增加什么进行详细讲解 好的&#xff0c;这是一个非常专业且重要的问题。为机器人增加力矩&#xff08;通常指提升关节输出扭矩&#xff09;不是一个简单的部件替换&#xff0c;而是一个涉及动力链、结构、控制和散热的系统性工程。 以下将详细讲…

spring集成aes加密、rsa加密

文章目录spring集成对称加密spring集成rsa加密spring集成对称加密 encrypt:key: aaabbb # 只配置这个参数就实现了对称加密salt: 333444 # 这个可以不配置spring集成rsa加密 例如apollo&#xff0c;如果没有配置encrypt.key&#xff0c;那么apollo不配置应该也是可以的&#…

OpenSTL PredRNNv2 模型复现与自定义数据集训练

OpenSTL PredRNNv2 模型复现与自定义数据集训练 概述 本文将详细介绍如何复现 OpenSTL 中的 PredRNNv2 模型&#xff0c;并使用自定义的 NPY 格式数据集进行训练和预测。我们将从环境配置开始&#xff0c;逐步讲解数据预处理、模型构建、训练过程和预测实现&#xff0c;最终实现…

Linux内核IPv4隧道模式封装机制剖析

概述 在Linux网络栈中,XFRM(Transform)子系统负责实现IPsec等安全协议的功能。其中,xfrm4_mode_tunnel.c是实现IPv4隧道模式封装的核心模块,为IPv4数据包提供隧道模式的封装和解封装能力。本文将深入分析这一模块的实现机制。 模块架构与功能 该模块通过注册到XFRM框架…

OPC Client第10讲:实现主界面;获取初始界面传来的所有配置信息config【C++读写Excel:xlnx;ODBC;缓冲区】

接前面代码内容&#xff1a; OPC Client第6讲&#xff08;wxwidgets&#xff09;&#xff1a;Logger.h日志记录文件&#xff08;单例模式&#xff09;&#xff1b;登录后的主界面_wx.logger-CSDN博客 OPC Client第8讲&#xff1a;OPC UA&#xff1b;KEPServerEX创建OPC服务器…

快速入门HarmonyOS应用开发(一)

目录 前言 一、准备工作 二、实战开发 2.1、Navigation简介 2.2、页面路由开发 2.2.1、创建常量 2.2.2、创建字符串资源 2.2.3、创建float资源 2.2.4、创建color资源 2.2.5、创建数据实体 2.2.6、创建页面路由表 2.2.7、创建Navigation根容器 2.2.8、创建NavDesti…

AI 进课堂 - 语文教学流程重塑

AI 进课堂 - 语文教学流程重塑执教语文十余年&#xff0c;备课案头的参考书堆得比学生作业本还高&#xff0c;批改作文时红笔芯换得比粉笔还勤。 直到去年把 JBoltAI 请进课堂&#xff0c;那些重复机械的工作突然有了新解法&#xff0c;连课堂上孩子们的眼神都亮了许多 —— 这…