Spring Boot 啟動流程及配置類解析原理

Spring Boot 是一個基于 Spring 框架的開源框架,旨在簡化 Spring 應用的配置和部署。通過提供約定優于配置的原則,Spring Boot 大大降低了 Java 企業級應用的開發復雜度。本文將詳細介紹 Spring Boot 的啟動流程及其配置類的解析原理,幫助開發者深入理解 Spring Boot 的工作機制。

一、Spring Boot 啟動流程

1.1 啟動入口

Spring Boot 應用的啟動入口通常是一個帶有 main 方法的類,該類被注解為 @SpringBootApplication。該注解實際上是一個復合注解,包含了以下三個注解:

  • @Configuration:指示該類是一個 Spring 配置類。
  • @EnableAutoConfiguration:啟用 Spring Boot 的自動配置機制。
  • @ComponentScan:啟用組件掃描,以自動發現并注冊 Spring 組件。

以下是一個簡單的 Spring Boot 啟動類示例:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
}
?

1.2 SpringApplication 的啟動過程

main 方法中,調用了 SpringApplication.run() 方法,該方法是 Spring Boot 應用啟動的核心。其主要流程如下:

  1. 創建 SpringApplication 實例
    SpringApplication 是啟動 Spring Boot 應用的核心類。它負責啟動應用的上下文,并執行所有必要的初始化步驟。

    SpringApplication application = new SpringApplication(MyApplication.class);
    ?
    
  2. 準備上下文
    run 方法中,首先會準備一個 ApplicationContext(默認是 AnnotationConfigApplicationContextWebApplicationContext),并將主類傳入。

  3. 加載配置
    根據 @SpringBootApplication 中的設置,加載應用的配置文件(如 application.propertiesapplication.yml),并將其轉化為配置屬性。

  4. 執行自動配置
    通過 @EnableAutoConfiguration 注解,Spring Boot 會自動裝配必要的組件。例如,如果存在數據庫驅動,則自動配置 DataSource

  5. 啟動應用上下文
    啟動 ApplicationContext,完成 Bean 的初始化和依賴注入。

  6. 觸發 ApplicationRunner 和 CommandLineRunner
    如果定義了 ApplicationRunnerCommandLineRunner 接口的實現類,Spring Boot 會在應用啟動后自動調用它們。

1.3 SpringApplication.run() 的關鍵步驟

以下是 SpringApplication.run() 方法中的關鍵步驟詳細解析:

public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {SpringApplication application = new SpringApplication(primarySource);return application.run(args);
}
?
  1. 構造 SpringApplication 實例
    primarySource 是啟動類,用于加載上下文。
  2. 準備環境
    調用 prepareEnvironment() 方法,設置應用的環境(如 EnvironmentApplicationArguments)。
  3. 創建應用上下文
    調用 createApplicationContext() 方法,根據應用類型創建相應的 ApplicationContext
  4. 準備上下文
    調用 prepareContext() 方法,配置上下文的屬性和 Bean。
  5. 刷新上下文
    調用 refreshContext() 方法,初始化和刷新上下文。
  6. 調用應用的生命周期事件
    觸發 ApplicationStartedEventApplicationReadyEvent 事件。

1.4 事件機制

在 Spring Boot 啟動過程中,會觸發多個事件,例如 ApplicationStartedEventApplicationEnvironmentPreparedEventApplicationReadyEvent。開發者可以通過實現 ApplicationListener 接口來監聽這些事件。

二、Spring Boot 配置類解析原理

2.1 配置類的定義

在 Spring Boot 中,配置類通常是使用 @Configuration 注解標記的類。這些類用于定義 Bean,進行依賴注入和其他配置信息。以下是一個配置類的示例:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyConfig {@Beanpublic MyService myService() {return new MyService();}
}
?

2.2 配置類的解析過程

當 Spring Boot 啟動時,配置類的解析過程主要涉及以下步驟:

  1. 組件掃描
    @SpringBootApplication 注解的類中,會進行組件掃描,尋找所有的 @Configuration 注解。
  2. 創建 ConfigurationClassParser 實例
    ConfigurationClassParser 是解析配置類的核心類,負責分析和處理所有的配置類。
  3. 解析配置類
    ConfigurationClassParser 會解析配置類中的 @Bean 方法,并生成相應的 BeanDefinition。
  4. 注冊 BeanDefinition
    將解析得到的 BeanDefinition 注冊到 BeanDefinitionRegistry 中,供后續使用。

2.3 Bean 的創建與注入

當需要使用某個 Bean 時,Spring 容器會根據 BeanDefinition 創建 Bean 實例,并進行依賴注入。

  1. 獲取 BeanDefinition
    在調用 Bean 的時候,Spring 會從 ApplicationContext 中獲取對應的 BeanDefinition。
  2. 實例化 Bean
    使用 BeanFactory 中的 doGetBean() 方法,創建 Bean 實例。
  3. 依賴注入
    Spring 會自動識別 Bean 的依賴關系,進行依賴注入。

2.4 注解的作用

在配置類中,常用的注解包括:

  • @Bean:用于定義 Bean 方法,返回的對象將被注冊為 Spring 的 Bean。
  • @Configuration:標識配置類,表示該類可以包含多個 @Bean 方法。
  • @Conditional:用于條件化 Bean 的創建,根據條件決定是否創建 Bean。

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

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

相關文章

Flask 核心概念速覽:路由、請求、響應與藍圖

一、路由參數與請求方法 Flask 路由允許定義多種參數類型,并通過 methods 屬性限制請求方法。 1. 路由參數類型: 除了默認的 string,Flask 還支持: int: 匹配整數,自動轉換為 Python int 類型。非數字輸入會返回 404。 float: 匹配浮點數,自動轉換為 Python float 類型…

Beckhoff(倍福)PLC 順控程序轉換條件解讀

一、請求機器人上件步 二、程序代碼解釋:1、程序代碼1&#xff1a; 1、程序代碼&#xff1a; fbVar_TonDelay2(IN : (bInPartPresentLeft AND bInPartPresentRight), PT : T#100MS);(* Go to the next step *) stVar_SEQ.bTOK : stVar_SEQ.bRELEASE AND(stGV_SYS_ELEMENTS.ar…

KITTI數據集(計算機視覺和自動駕駛領域)

KITTI&#xff08;Karlsruhe Institute of Technology and Toyota Technological Institute at Chicago&#xff09;數據集是計算機視覺和自動駕駛領域中最廣泛使用的基準數據集之一。它由德國卡爾斯魯厄理工學院和美國芝加哥豐田技術研究所聯合發布&#xff0c;旨在推動自動駕…

echarts在uniapp中使用安卓真機運行時無法顯示的問題

文章目錄 一、實現效果二、話不多說&#xff0c;上源碼 前言&#xff1a;我們在uniapp中開發的時候&#xff0c;開發的時候很正常&#xff0c;echarts的圖形在h5頁面上也是很正常的&#xff0c;但是當我們打包成安卓app或者使用安卓真機運行的時候&#xff0c;圖形根本就沒有渲…

C#使用MindFusion.Diagramming框架繪制流程圖(1):基礎類型

MindFusion.Diagramming框架 在C#中使用MindFusion.Diagramming.dll庫來創建圖表和圖形界面&#xff0c;可以讓你構建出豐富和交互式的圖形應用。MindFusion.Diagramming 是一個強大的庫&#xff0c;支持創建各種類型的圖表&#xff0c;例如流程圖、網絡圖、組織結構圖等。 M…

LangChain【6】之輸出解析器:結構化LLM響應的關鍵工具

文章目錄 一 LangChain輸出解析器概述1.1 什么是輸出解析器&#xff1f;1.2 主要功能與工作原理1.3 常用解析器類型 二 主要輸出解析器類型2.1 Pydantic/Json輸出解析器2.2 結構化輸出解析器2.3 列表解析器2.4 日期解析器2.5 Json輸出解析器2.6 xml輸出解析器 三 高級使用技巧3…

Spring Boot項目中JSON解析庫的深度解析與應用實踐

在現代Web開發中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作為輕量級的數據交換格式&#xff0c;已成為前后端通信的核心橋梁。Spring Boot作為Java生態中最流行的微服務框架&#xff0c;提供了對多種JSON庫的無縫集成支持。本文將深入探討Spring B…

OPenCV CUDA模塊光流------高效地執行光流估計的類BroxOpticalFlow

操作系統&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 編程語言&#xff1a;C11 算法描述 cv::cuda::BroxOpticalFlow 是 OpenCV CUDA 模塊中實現Brox光流算法的類。該類用于在 GPU 上高效地計算兩幀圖像之間的稠密光流&#xff08;Dens…

視覺分析在人員行為屬性檢測中的應用

基于視覺分析的人員行為屬性檢測方案 一、背景與需求分析 在工業生產、建筑施工、公共安全等領域&#xff0c;人員行為屬性的合規性檢測是保障安全生產的關鍵環節。例如&#xff0c;工地工人未佩戴安全帽、廚房人員未佩戴手套、作業現場人員使用手機等行為&#xff0c;均可能…

Linux--進程的程序替換

問題導入&#xff1a; 前面我們知道了&#xff0c;fork之后&#xff0c;子進程會繼承父進程的代碼和“數據”&#xff08;寫實拷貝&#xff09;。 那么如果我們需要子進程完全去完成一個自己的程序怎么辦呢&#xff1f; 進程的程序替換來完成這個功能&#xff01; 1.替換原理…

場景題-3

如何實現一個消息隊列 拆解分析主流的幾種消息隊列 1、基本架構 生產者Producer、消費者Consumer、Broker&#xff1a;生產者發送消息&#xff0c;消費者接受消息&#xff0c;Broker是服務端&#xff0c;處理消息的存儲、備份、刪除和消費關系的維護。 主題和分區&#xff…

vue2 項目中 npm run dev 運行98% after emitting CopyPlugin 卡死

今天在運行項目時&#xff0c;發現如下問題&#xff1a; 開始以為是node_modules依賴的問題&#xff0c;于是重新 npm install&#xff0c;重啟項目后還是未解決。 在網上找了一圈發現有人說是 require引入圖片地址沒有寫。在我的項目中排查沒有這個問題&#xff0c;最后發現某…

73 LV的使用(XFS文件系統)

四 LV的使用 先創建一個LV01 lvcreate -L 10G lv01 datavg Logical volume "lv01" created. 將創建出來的LV01進行格式化 mkfs.xxx LV的名稱(絕對路徑) 絕對路徑的組成:/dev/你創建VG的名字/LV的名字 mkfs.xfs /dev/datavg/lv01 掛載你的LV…

mybatis中判斷等于字符串的條件怎么寫

mybatis中判斷等于字符串的條件怎么寫_mybatis 等于字符串-CSDN博客 因為mybatis映射文件&#xff0c;是使用的ognl表達式&#xff0c;ognl是java語言&#xff08;強類型語言&#xff09;&#xff0c;會把‘X’解析成字符&#xff0c;而不是字符串。 所以比較字符串相等使用是…

C語言實現絕對值差值函數

在C語言中&#xff0c;可以編寫一個函數來計算兩個數的差值的絕對值。以下是一個簡單的實現&#xff1a; #include <stdio.h> #include <stdlib.h> // 用于abs函數&#xff08;如果需要&#xff09; // 方法1&#xff1a;使用標準庫函數 int absoluteDifference1…

Three.js中AR實現詳解并詳細介紹基于圖像標記模式AR生成的詳細步驟

文檔地址 Three.js中AR實現詳解 以下是Three.js中實現AR功能的詳細解析&#xff0c;涵蓋技術原理、實現步驟、核心組件及優化策略&#xff1a; &#x1f9e9; 一、技術基礎 AR.js框架的核心作用 AR.js是Three.js實現AR的基石&#xff0c;提供以下核心能力&#xff1a; 多模…

Vue3.5 企業級管理系統實戰(二十三):權限指令

在實際應用場景中&#xff0c;常常需要依據用戶角色對按鈕的操作權限實施控制。實現這一控制主要有兩種方式&#xff1a;一種是借助前端指令基于角色進行權限管控&#xff0c;另一種是通過后臺返回對應的權限屬性來實現精細化控制。本文聚焦于前端權限指令展開探討。 1 權限指…

軟考 系統架構設計師系列知識點之雜項集萃(81)

接前一篇文章&#xff1a;軟考 系統架構設計師系列知識點之雜項集萃&#xff08;80&#xff09; 第145題 商業智能是企業對商業數據的搜集、管理和分析的系統過程&#xff0c;主要技術包括&#xff08;&#xff09;。 A. 數據倉庫、聯機分析和數據挖掘 B. 數據采集、數據清洗…

深入淺出Java ParallelStream:高效并行利器還是隱藏的陷阱?

在Java 8帶來的眾多革新中&#xff0c;Stream API徹底改變了我們對集合操作的方式。而其中最引人注目的特性之一便是parallelStream——它承諾只需簡單調用一個方法&#xff0c;就能讓數據處理任務自動并行化&#xff0c;充分利用多核CPU的優勢。但在美好承諾的背后&#xff0c…

SQL Transactions(事務)、隔離機制

目錄 Why Transactions? Example: Bad Interaction Transactions ACID Transactions COMMIT ROLLBACK How the Transaction Log Works How Data Is Stored Example: Interacting Processes Interleaving of Statements Example: Strange Interleaving Fixing the…