Spring Boot 3.3 【二】Spring Boot自動配置機制深度解析

簡單動作,深刻聯結。在這技術海洋,我備好舟,等你揚帆。啟航吧!
🌟點擊【關注】,解鎖定期的技術驚喜,讓靈感與知識的源泉不斷涌動。
👍一個【點贊】,如同心照不宣的默契,是我們共同語言的閃亮印記。
📚【收藏】好文,搭建你的專屬智慧庫,讓每次回望都能照亮新知之路。


一、引言

Spring Boot作為Java領域最為流行的快速開發框架之一,其核心特性之一就是其強大的自動配置機制。隨著Spring Boot 3.3.1的發布,這一機制得到了進一步的優化和完善,為開發者提供了更加便捷、高效的應用程序搭建和部署體驗。本文將深入講解Spring Boot 3.3.1的自動配置機制,包括其工作原理、特點、優勢,并通過實際代碼示例和源碼解析,展示如何在應用中靈活運用這一機制。此外,我們還將探討可能遇到的挑戰及相應的解決方案。

二、Spring Boot 的前任

在Spring Boot出現之前,使用Spring框架搭建項目時,管理依賴(即JAR包)是一項相對繁瑣且容易出錯的任務。筆者在當時在搭建項目時,經常遇到以下問題:

1. 依賴管理復雜

  • 手動管理依賴:在Spring Boot之前,項目中的jar包依賴往往需要手動管理,這包括下載、版本控制以及解決依賴沖突等。這一過程既繁瑣又容易出錯。
  • 版本沖突:不同庫之間可能存在版本沖突,手動解決這些沖突需要開發者具備深厚的專業知識和經驗。

2. 打包部署不便

  • 打包方式單一:傳統的打包方式不夠靈活,難以滿足現代應用快速迭代和部署的需求。
  • 內置服務器缺乏:許多應用需要外部Tomcat等服務器來運行,這增加了部署的復雜性和對環境的依賴。

3. 運行時配置靈活性不足

  • 配置文件內置:在Spring Boot之前,應用的配置文件通常內置在jar包中,這意味著每次修改配置都需要重新打包和部署,降低了開發和部署的效率。
  • 環境適配性差:不同環境(如開發、測試、生產環境)可能需要不同的配置,內置配置的方式使得環境適配變得復雜和困難。

4. 缺乏統一的構建和部署工具

  • 構建工具多樣:在沒有Spring Boot之前,Java應用的構建工具多種多樣,如Ant、Maven、Gradle等,但缺乏一個統一且廣泛接受的標準。
  • 部署流程不統一:不同的項目可能采用不同的部署流程,這增加了維護的復雜性和成本。

三、Spring Boot 的自動配置機制

Spring Boot 的自動配置機制通過提供合理的默認配置、自動掃描和配置、基于條件的自動配置等特點,極大地簡化了Spring應用的開發過程,提高了開發效率,并降低了配置錯誤的風險。同時,它還支持微服務架構、易于集成第三方庫、提供豐富的監控和管理功能等優勢,使得Spring Boot成為現代Java開發不可或缺的框架之一。

1. 約定優于配置:

  • Spring Boot遵循 “約定優于配置” 的原則,提供了一系列合理的默認配置,開發者只需關注應用的核心業務邏輯,而無需花費大量時間在繁瑣的配置上。

2. 自動掃描和配置:

  • Spring Boot啟動時會自動掃描項目依賴和類路徑中的特定注解(如 @SpringBootApplication ),并根據這些依賴和注解自動配置Spring容器中的Bean。

3. 基于條件的自動配置:

  • 自動配置類通常使用條件注解(如 @ConditionalOnClass@ConditionalOnBean@ConditionalOnProperty等)來確保只有在特定條件滿足時才應用配置。這種機制使自動配置更加靈活和智能。

4. 外部化配置:

  • Spring Boot支持將配置信息外部化,通過 application.propertiesapplication.yml 文件來管理配置,這些配置信息可以在運行時被Spring容器讀取并綁定到相應的Bean上。

5. Starter POMs:

  • Spring Boot提供了大量的starter POMs,這些starter包含了開發特定類型應用所需的所有依賴。開發者只需在項目中添加相應的starter依賴,Spring Boot就會自動配置好所需的環境。

四、Spring Boot 啟動流程分析

1. 啟動入口

  • Spring Boot應用的啟動通常從main方法開始,該方法中調用 SpringApplication.run() 方法。
@SpringBootApplication  
public class DemoApplication {  public static void main(String[] args) {  SpringApplication.run(DemoApplication.class, args);  }  
}

這里,@SpringBootApplication 是一個組合注解,包含了 @SpringBootConfiguration@EnableAutoConfiguration@ComponentScan

2. SpringApplication實例化

  • 在調用 SpringApplication.run() 之前,會首先實例化一個 SpringApplication 對象。這個過程中,Spring Boot會進行一些初始化工作,如推斷主類、設置應用類型、加載配置文件等。

3. 加載SpringApplicationRunListeners

  • Spring Boot會加載所有實現了 SpringApplicationRunListener 接口的監聽器,這些監聽器會在應用啟動的不同階段被觸發。

4. 設置應用環境:

  • 準備 Environment 對象,該對象包含了系統的屬性和用戶配置的屬性。
  • 加載 application.propertiesapplication.yml 等配置文件,將配置信息添加到Environment 中。

5. 創建ApplicationContext

  • 根據應用類型(如Web應用或非Web應用)創建合適的 ApplicationContext 實例。
  • 對于Web應用,Spring Boot默認會創建一個嵌入式的Web服務器(如Tomcat)。

5. 準備上下文

  • Environment 設置到 ApplicationContext 中。
  • 應用所有加載的 ApplicationContextInitializer,這些初始化器可以對 ApplicationContext 進行自定義配置。

6. 執行初始化方法

  • 執行所有通過 @Bean 注解聲明的初始化方法。

7. 發布事件

  • 在應用啟動的不同階段,Spring Boot會發布不同的事件,監聽器可以監聽這些事件來執行自定義邏輯。

9. 結束計時器

  • 如果在啟動過程中開啟了計時器,那么在應用啟動完成后會結束計時器,并打印出啟動耗時。

五、Spring Boot 核心注解源碼解析

為了深入理解自動配置機制的工作原理,我們可以查看Spring Boot的源碼。

1. @SpringBootApplication注解

  • @SpringBootApplication 是一個組合注解,它包含了 @EnableAutoConfiguration@SpringBootConfiguration@ComponentScan。其中,@EnableAutoConfiguration 是自動配置的關鍵。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {//..................
}

2. @EnableAutoConfiguration注解

  • @EnableAutoConfiguration 注解通過 @Import 導入了AutoConfigurationImportSelector 類,該類負責在啟動時掃描并導入自動配置類。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {//............
}

3. AutoConfigurationImportSelector類

  • AutoConfigurationImportSelector 類通過實現 DeferredImportSelector 接口,在Spring容器加載Bean定義時選擇性地導入自動配置類。其核心方法是 selectImports,它根據類路徑上的條件選擇需要導入的自動配置類列表。
public class AutoConfigurationImportSelector implements DeferredImportSelector, BeanClassLoaderAware,ResourceLoaderAware, BeanFactoryAware, EnvironmentAware, Ordered {//.........................................@Overridepublic String[] selectImports(AnnotationMetadata annotationMetadata) {if (!isEnabled(annotationMetadata)) {return NO_IMPORTS;}AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());}//............................
}

4. 自動配置類的條件注解

  • 自動配置類通常使用條件注解(如 @ConditionalOnClass@ConditionalOnBean@ConditionalOnProperty等)來確保只有在特定條件滿足時才應用配置。例如,WebMvcAutoConfiguration 類使用 @ConditionalOnWebApplication 注解確保只有在Web應用環境中才生效。
@AutoConfiguration(after = { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class })
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@ImportRuntimeHints(WebResourcesRuntimeHints.class)
public class WebMvcAutoConfiguration {//......................
}

六、挑戰與解決方案

1. 挑戰一:默認配置不符合需求

雖然Spring Boot提供了默認配置,但在某些情況下,這些默認配置可能不符合應用的實際需求。

解決方案:

  • 通過 application.propertiesapplication.yml 配置文件覆蓋默認配置。
  • 創建自定義配置類,并使用 @Configuration@Bean 注解定義自己的Bean配置。

2. 挑戰二:自動配置類沖突

在復雜的項目中,可能會引入多個starter依賴,導致自動配置類之間的沖突。

解決方案:

  • 使用 @SpringBootApplication 注解中的 exclude 屬性排除不需要的自動配置類。
  • application.propertiesapplication.yml 中使用 spring.autoconfigure.exclude 屬性排除自動配置類。

3. 挑戰三:理解自動配置機制復雜

自動配置機制背后涉及多個組件和復雜的邏輯,對于初學者來說可能難以理解。

解決方案:

  • 深入閱讀Spring Boot官方文檔和源碼,理解自動配置的工作原理。
  • 參與社區討論,關注博主系列博文,反復觀看,溫故知新。
  • 實踐是學習的最佳途徑,通過動手編寫代碼加深對自動配置機制的理解。

結束語

Spring Boot 的自動配置機制極大地簡化了Java應用的開發和部署過程,通過默認配置和條件化配置,使得開發者能夠更專注于業務邏輯的實現。然而,在實際應用中,我們仍需注意默認配置可能不符合需求、自動配置類沖突以及理解機制復雜等挑戰。通過靈活運用配置文件、自定義配置類以及深入學習官方文檔和源碼,我們可以更好地利用Spring Boot的自動配置機制,提高開發效率和應用質量。

小貼士

在 Spring Boot 2.7 之前,自動配置類通常通過位于 META-INF/spring.factories 文件中的條目進行聲明。但從 Spring Boot 2.7 開始,雖然仍支持舊的方式,但推薦使用新的路徑 /META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 來存放自動配置類的導入信息。這一改變旨在提高配置的靈活性和清晰度。

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

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

相關文章

Unity免費領場景多人實時協作地編2人版局域網和LAN聯機類似谷歌文檔協同合作搭建場景同步資產設置編輯付費版支持10人甚至更多20240709

大家有沒有用過谷歌文檔、石墨文檔、飛書文檔等等之類的協同工具呢? Blender也有類似多人聯機建模的插件, Unity也有類似的多人合作搭建場景的插件啦。 剛找到一款免費插件,可以支持2人局域網和LAN聯機地編。 付費的版本支持組建更大的團隊。…

詳解如何通過稀疏向量優化信息檢索

在信息檢索方法的發展歷程中,我們見證了從傳統的統計關鍵詞匹配到如 BERT 這樣的深度學習模型的轉變。雖然傳統方法提供了堅實的基礎,但往往難以精準捕捉文本的語義關系。如 BERT 這樣的稠密檢索方法通過利用高維向量捕獲文本的上下文語義,為…

煙霧識別技術在火災預防中的應用:思通數科大模型的力量

引言 火災是導致生命財產損失的重大災害之一。早期檢測和快速響應是預防火災和減少損失的關鍵。結合思通數科大模型的煙霧識別技術,為實時檢測和精確定位煙霧來源提供了一種高效的解決方案。本文將探討這一技術如何有效預防火災并保障人員安全。 煙霧識別技術概述 …

注冊自定義總線

1、在/sys/bus下注冊一個自定義總線 #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h> #include<linux/kobject.h> #include<linux/slab.h> #include<linux/sysfs.h> #include<linux/device.h> #include…

bug修復 修復修復修復

好的&#xff0c;這里是更新后的代碼&#xff0c;將所有 inRange 函數的第一個變量替換為 ZoomOutimage&#xff1a; // 綠色分岔路 if (divergerColor "green" && nextColor "null") {cv::Mat frameGreen, frameRed;frame2.copyTo(frameGreen)…

如何在 Fedora 中使用 `shred` 擦除驅動器或文件

English Version: https://blog.csdn.net/sch0120/article/details/140390161 如何在 Fedora 中使用 shred 擦除驅動器或文件 安全擦除驅動器對于保護您的敏感數據免受未授權訪問至關重要。在這篇博文中&#xff0c;我們將學習如何在 Fedora 中使用 shred 命令安全擦除整個驅…

FATE Flow 源碼解析 - 作業提交處理流程

背景介紹 FATE 是隱私計算中最有名的開源項目了&#xff0c;從 star 的數量上來看也可以看出來。截止 2023 年 3 月共收獲 4.9k 個 star&#xff0c;但是 FATE 一直被認為代碼框架復雜&#xff0c;難以理解&#xff0c;作為一個相關的從業者&#xff0c;后續會持續對 FATE 項目…

React@16.x(56)Redux@4.x(5)- 實現 createStore

目錄 1&#xff0c;分析2&#xff0c;實現2.1&#xff0c;基礎實現2.2&#xff0c;優化2.2.1&#xff0c;隨機字符串2.2.2&#xff0c;action 的判斷2.2.2&#xff0c;監聽器的優化 2.3&#xff0c;最終形態 1&#xff0c;分析 createStore()&#xff0c;參數1為 reducer&…

0601STM32TIM

TOC 分為四部分&#xff0c;八小節 一部分&#xff1a;主要講定時器基本定時的功能&#xff0c;也就是定一個事件&#xff0c;讓定時器每隔這個時間產生一個中斷&#xff0c;來實現每隔一個固定時間來執行一段程序的目的&#xff0c;比如做一個時鐘、秒表&#xff0c;或者使用一…

【Linux】1w詳解如何實現一個簡單的shell

目錄 實現思路 1. 交互 獲取命令行 2. 子串分割 解析命令行 3. 指令的判斷 內建命令 4. 普通命令的執行 補充&#xff1a;vim 文本替換 整體代碼 重點思考 1.getenv和putenv是什么意思 2.代碼extern char **environ; 3.內建命令是什么 4.lastcode WEXITSTATUS(sta…

Java-final關鍵字詳解

Java-final關鍵字詳解 一、引言 二、什么是 final 關鍵字&#xff1f; 三、final 變量 final 局部變量 final 實例變量 final 靜態變量 四、final 方法 五、final 類 六、final 關鍵字的實際應用 1. 定義常量 2. 防止方法被重寫 3. 創建不可變類 4. 優化性能 七、…

切割01串(牛客小白月賽98)

題意&#xff1a; 給三個整數n&#xff0c;l&#xff0c;r&#xff0c;和一個字符串s&#xff0c;滿足l<|c0-c1|<r就可以切成字符串a和字符串b&#xff0c;c0為字符串a左側出現0的次數&#xff0c;c1為字符串b右側出現1的次數&#xff0c;求最多切割次數 知識點&#x…

Onnx 1-深度學習-概述1

Onnx 1-深度學習-概述1 一: Onnx 概念1> Onnx 介紹2> Onnx 的作用3> Onnx 應用場景4> Onnx 文件格式1. Protobuf 特點2. onnx.proto3協議3> Onnx 模型基本操作二:Onnx API1> 算子詳解2> Onnx 算子介紹三: Onnx 模型1> Onnx 函數功能

昇思學習打卡-8-計算機視覺/FCN圖像語義分割

目錄 FCN介紹FCN所用的技術訓練數據的可視化模型訓練模型推理FCN的優點和不足優點不足 FCN介紹 FCN主要用于圖像分割領域&#xff0c;是一種端到端的分割方法&#xff0c;是深度學習應用在圖像語義分割的開山之作。通過進行像素級的預測直接得出與原圖大小相等的label map。因…

【C++基礎】初識C++(2)--引用、const、inline、nullptr

目錄 一、引用 1.1 引用的概念和定義 1.2 引用的特性 1.3引用的使用 1.4 const引用 1.5 指針和引用的關系 二、inline 三、nullptr 一、引用 1.1 引用的概念和定義 引?不是新定義?個變量&#xff0c;?是給已存在變量取了?個別名&#xff0c;編譯器不會為引?…

微軟的人工智能語音生成器在測試中達到與人類同等水平

微軟公司開發了一種新的神經編解碼語言模型 Vall-E&#xff0c;在自然度、語音魯棒性和說話者相似性方面都超越了以前的成果。它是同類產品中第一個在兩個流行基準測試中達到人類同等水平的產品&#xff0c;而且顯然非常逼真&#xff0c;以至于微軟不打算向公眾開放。 VALL-E …

Node.js 模塊系統

Node.js 模塊系統 Node.js 的模塊系統是其核心特性之一,它允許開發者將代碼組織成可重用的模塊。這種系統促進了代碼的模塊化,使得大型應用程序的構建和管理變得更加容易。本文將深入探討 Node.js 的模塊系統,包括其工作原理、如何創建和使用模塊,以及模塊系統的優勢和局限…

【每日一練】python類和對象現實舉例詳細講解

""" 本節課程目的&#xff1a; 1.掌握類描述現實世界實物思想 2.掌握類和對象的關系 3.理解什么事面向對象 """ #比如設計一個鬧鐘&#xff0c;在這里就新建一個類 class Clock:idNone #鬧鐘的序列號&#xff0c;也就是類的屬性priceNone #鬧…

Git最常用操作速查表

Git常用操作 文章目錄 Git常用操作1. 克隆/拉取2. 分支操作1. 查看分支2. 創建分支3. 切換到分支4. 刪除分支5. 刪除遠程分支6. 推送分支到遠程 3. 暫存庫操作4. Git團隊規范1. 原則2. 分支設計3. commit備注一般規范 1. 克隆/拉取 git clone xxx 從遠程倉庫克隆 git rebase…

【開源之美】:WinMerge Files

一、引言 強大的windows端文件比較工具&#xff0c;跟Beyond Compare相比&#xff0c;更為強大。但是這里我們推薦他的原因&#xff0c;不僅是因為作為一個使用的工具&#xff0c;主要是因為他開源&#xff0c;可以通過調試優秀的源代碼&#xff0c;進一步的提升C項目設計和編…