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
英文地址,請注明出處:http://en.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;連課堂上孩子們的眼神都亮了許多 —— 這…