Spring Boot 啟動生命周期詳解

Spring Boot 啟動生命周期詳解

在這里插入圖片描述

1. 啟動階段劃分

Spring Boot 啟動過程分為 4個核心階段,每個階段涉及不同的核心類和執行邏輯:


階段 1:預初始化(Pre-initialization)

  • 目標:準備啟動器和環境配置
  • 關鍵類
    • SpringApplication:啟動器核心類,負責協調整個啟動流程
    • SpringApplicationBuilder:構建啟動器的輔助類(可選)
    • Environment:存儲配置屬性(如 application.properties
  • 執行流程
    1. 通過 SpringApplication.run() 方法啟動應用
    2. 初始化 SpringApplication 對象,設置參數(如主類、環境變量)
    3. 加載 Environment 的默認配置(如系統屬性、JVM參數)

階段 2:初始化(Initialization)

  • 目標:創建 ApplicationContext 并加載核心配置
  • 關鍵類
    • ApplicationContext:Spring 容器(如 AnnotationConfigServletWebServerApplicationContext
    • SpringApplicationRunListener:監聽啟動事件(如 ServletWebServerApplicationContext
    • ApplicationContextInitializer:初始化容器(如 ConfigFileApplicationListener
  • 執行流程
    1. 創建 ApplicationContext 實例(Web項目通常為 WebApplicationContext
    2. 通過 ApplicationContextInitializer 初始化容器(如加載 @PropertySource
    3. 調用 SpringApplicationRunListenerstarting() 方法通知啟動

階段 3:刷新(Refresh)

  • 目標:加載 Bean 定義并完成容器初始化
  • 關鍵類
    • ConfigurableApplicationContext:支持刷新的容器接口
    • BeanFactory:Bean 定義的注冊表
    • BeanDefinitionReader:讀取 Bean 配置(如 XML 或注解)
    • BeanFactoryPostProcessor:修改 Bean 定義(如 PropertySourcesBeanFactoryPostProcessor
    • BeanPostProcessor:修改 Bean 實例(如 AutowiredAnnotationBeanPostProcessor
  • 執行流程
    1. 加載 Bean 定義:通過組件掃描(@ComponentScan)或 XML 配置
    2. BeanFactory 后處理BeanFactoryPostProcessor 修改 Bean 定義(如屬性源)
    3. 實例化 Bean:創建 Bean 實例(但不注入依賴)
    4. Bean 后處理BeanPostProcessor 處理 Bean 實例(如依賴注入)
    5. 注冊 Bean:將 Bean 注冊到容器中

階段 4:運行(Run)

  • 目標:啟動嵌入式服務器并完成應用就緒
  • 關鍵類
    • EmbeddedWebApplicationContext:嵌入式 Web 容器(如 Tomcat、Jetty)
    • ApplicationRunner:自定義啟動后邏輯(@Order 可控制順序)
    • CommandLineRunner:命令行參數處理(與 ApplicationRunner 類似)
  • 執行流程
    1. 啟動嵌入式 Web 服務器(如 Tomcat)
    2. 執行 ApplicationRunnerCommandLineRunner(按順序)
    3. 輸出啟動完成日志(如 Started Application in ... seconds

表格總結:Spring Boot 啟動階段與核心類

階段關鍵類作用
預初始化SpringApplication, Environment初始化啟動器,加載基礎環境配置
初始化ApplicationContext, SpringApplicationRunListener, ApplicationContextInitializer創建容器,初始化配置,監聽啟動事件
刷新ConfigurableApplicationContext, BeanFactory, BeanFactoryPostProcessor, BeanPostProcessor加載 Bean 定義,處理 Bean 定義和實例化,完成依賴注入
運行EmbeddedWebApplicationContext, ApplicationRunner, CommandLineRunner啟動嵌入式服務器,執行自定義啟動后邏輯

關鍵類說明

  1. SpringApplication
    • 核心啟動器,協調整個生命周期,支持多種應用類型(如 Web、CLI)。
  2. ApplicationContext
    • Spring 容器,管理 Bean 的生命周期和依賴注入。
  3. BeanFactoryPostProcessor
    • 在 Bean 實例化前修改 Bean 定義(如 PropertySourcesBeanFactoryPostProcessor)。
  4. BeanPostProcessor
    • 在 Bean 實例化后、依賴注入前修改 Bean 實例(如 AutowiredAnnotationBeanPostProcessor)。
  5. EmbeddedWebApplicationContext
    • Web 應用的容器,集成嵌入式服務器(如 Tomcat)。

執行順序總結

plaintext
SpringApplication.run() →
預初始化 → 初始化 → 刷新 → 運行 → 應用啟動完成

通過以上流程,Spring Boot 實現了從啟動到服務就緒的完整生命周期管理。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/80489.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/80489.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/80489.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

《深入理解 AOP》

一、AOP 是什么 AOP(Aspect Oriented Programming),即面向切面編程,是軟件開發中一種重要的編程范式。它通過橫向抽取機制,將那些與業務邏輯本身無關、卻為業務模塊所共同調用的邏輯或責任(如事務處理、日…

Python【協程(Coroutine)和線程的關系】

協程(Coroutine)和線程都是實現并發編程的技術,但它們在實現方式、使用場景和性能上有顯著區別。理解它們的關系與差異有助于在實際應用中選擇合適的并發模型,以下是它們的核心關系與對比分析: 一、核心關系 互補關系 協程和線程可以結合使用…

Springboot——Redis的使用

在當今的軟件開發領域,緩存技術是提升應用性能的關鍵手段之一。Redis 作為一款高性能的鍵值對存儲數據庫,憑借其出色的讀寫速度和豐富的數據結構,在緩存場景中得到了廣泛應用。Spring Boot 作為一款簡化 Spring 應用開發的框架,與…

BEVPoolv2:A Cutting-edge Implementation of BEVDet Toward Deployment

背景 該論文是在BEVDet的基礎上進行了一個調整優化,傳統的方法是將特征圖與深度預測進行外積得到視椎特征圖,再將它與預處理好的體素索引結合,將每個視椎特征分類到每個voxel中進行累加和的操作。BEVFusion與BEVDepth等方法是避免了累加和&a…

藍橋杯常考的找規律題

目錄 靈感來源: B站視頻鏈接: 找規律題具有什么樣的特點: 報數游戲(Java組): 題目描述: 題目鏈接: 思路詳解: 代碼詳解: 階乘求和(Java組…

使用ffmpeg 將圖片合成為視頻,填充模糊背景,并添加兩段音樂

1.輸入3張圖片,每張播放一次,播放兩秒,視頻分辨率設置為1920:1080,每張圖片前0.3秒淡入,后0.3秒淡出,圖片寬高比不變,用白色填充空白區域 ffmpeg -loop 1 -t 2 -i "img1.jpg" \-loop 1 -t 2 -i "img2.jpg" \-loop 1 -t 2 -i "img3.jpg" \-filte…

PostgreSQL技術內幕29:事件觸發器tag原理解析

文章目錄 0.簡介1.概念說明2.tag的生成和存儲2.1 tag合法性校驗2.2 內存中存儲2.3 持久化存儲 3.tag的觸發 0.簡介 在上一篇文章中中,我們介紹了PG中的兩種觸發器,即適合于DML的普通觸發器和對于DDL的事件觸發器,其中事件觸發器與常規的 DML…

mysql 導入很慢,如何解決

精選 原創 碼出財富2025-04-14 17:35:14博主文章分類:數據庫©著作權 文章標簽mysql數據庫用戶名文章分類MySQL數據庫yyds干貨盤點閱讀數184 導入大型 SQL 文件到 MySQL 數據庫時,速度可能會受到影響。以下是一些優化方法和建議,幫助你…

多物理場耦合低溫等離子體裝置求解器PASSKEy2

文章目錄 PASSKEy2簡介PASSKEY2計算流程PASSKEy2 中求解的物理方程電路模型等離子體模型燃燒模型 PASSKEy2的使用 PASSKEy2簡介 PASSKEy2 是在 PASSKEy1 的基礎上重新編寫的等離子體數值模擬程序。 相較于 PASSKEy1, PASSKEy2 在具備解決低溫等離子體模擬問題的能力…

保姆級zabbix監控jmx、數據庫和網絡監控(SNMP)

前言 在當今數字化時代,企業IT基礎設施的穩定性與性能直接關系到業務連續性和用戶體驗。隨著系統復雜性的不斷增加,單一維度的監控已難以滿足全面運維需求。Zabbix作為一款功能強大的開源監控解決方案,通過整合JMX(Java Manageme…

復雜地形越野機器人導航新突破!VERTIFORMER:數據高效多任務Transformer助力越野機器人移動導航

作者: Mohammad Nazeri 1 ^{1} 1, Anuj Pokhrel 1 ^{1} 1, Alexandyr Card 1 ^{1} 1, Aniket Datar 1 ^{1} 1, Garrett Warnell 2 , 3 ^{2,3} 2,3, Xuesu Xiao 1 ^{1} 1單位: 1 ^{1} 1喬治梅森大學計算機科學系, 2 ^{2} 2美國陸軍研究實驗室&…

SharpMap與TerraLib:C#與C++開源GIS庫

大家好,今天為大家介紹的軟件是SharpMap:一款專為了C#(.NET)環境設計的開源地圖和空間數據處理庫;TerraLib:一款由C編寫、支持多種數據庫的開源的GIS軟件庫。 下面,我們將從兩個開源軟件的主要…

音視頻學習 - MP3格式

環境 JDK 13 IDEA Build #IC-243.26053.27, built on March 16, 2025 Demo MP3Parser MP3 MP3全稱為MPEG Audio Layer 3,它是一種高效的計算機音頻編碼方案,它以較大的壓縮比將音頻文件轉換成較小的擴展名為.mp3的文件,基本保持源文件的音…

Unity中數據和資源加密(異或加密,AES加密,MD5加密)

在項目開發中,始終會涉及到的一個問題,就是信息安全,在調用接口,或者加載的資源,都會涉及安全問題,因此就出現了各種各樣的加密方式。 常見的也是目前用的最廣的加密方式,分別是:DE…

部署本地deepseek并在調用的詳細步驟以及解決一些可能出現的問題(Windows,Linux, WSL)

打開Ollama官網:https://ollama.com/ 直接下載Ollama并且安裝好Ollama、這時候就能看到app里多了個ollama,但是我們不用打開它 打開Windows Powershell: ollama run deepseek-r1:1.5b 7b 8b 14b 32b 70b 根據自己的電腦配置和需求更換不同的…

【KWDB 創作者計劃】_嵌入式硬件篇---寄存器與存儲器截斷與溢出

文章目錄 前言一、寄存器與存儲器1. 定義與基本概念寄存器(Register)位置功能特點存儲器(Memory)位置功能特點2. 關鍵區別3. 層級關系與協作存儲層次結構協作示例4. 為什么需要寄存器性能優化指令支持減少總線競爭5. 其他寄存器類型專用寄存器程序計數器(PC)棧指針(SP)…

小白自學python第二天

學習python的第二天 一、判斷語句 1、布爾類型和比較運算符 1、布爾類型 表示現實生活中的邏輯,真(True,用數字1表示)和假(False,用數字0表示) 2、布爾類型變量的定義 變量的名稱 布爾類…

linux基礎操作1------(文件命令)

一.前言 我們本章開始講解linux,我們對于linux得有重要的認識,比如項目部署等等,都會用到linux,今天我們就開始linux的學習,我們需要準備的工具有vmware和xshell,而這里我就不教大家虛擬機的安裝以及xshel…

編碼問題整合

一、windows系統編碼 查看編碼命令:chcp - 936 GBK - 65001 UTF-8 - 437 英文修改系統編碼 1、控制面板修改 需管理員權限-Windows 10/11進入 控制面板 > 區域 > 管理 > 更改系統區域設置勾選 Beta版: 使用Unicode UTF-8提供全球語言支持 → 重啟生效修…

如何配置Spark

1.上傳spark安裝包到某一臺機器(自己在finaShell上的機器)。 2.解壓。 把第一步上傳的安裝包解壓到/opt/module下(也可以自己決定解壓到哪里)。對應的命令是:tar -zxvf 安裝包 -C /opt/module 3.重命名。進入/opt/mo…