重學SpringBoot3-自動配置機制

重學SpringBoot3-自動配置機制

  • 引言
  • Spring Boot 自動配置原理
  • 示例:Spring Boot Web 自動配置
  • 深入理解
  • 總結
  • 相關閱讀

引言

Spring Boot 的自動配置是其最強大的特性之一,它允許開發者通過最少的配置實現應用程序的快速開發和部署。這一切都得益于 Spring Boot 的 “約定優于配置” 的設計理念。本教程將帶你了解 Spring Boot 自動配置的背后原理,并通過示例解釋其工作方式。

Spring Boot 自動配置原理

Spring Boot 自動配置的核心是一系列自動配置類,這些類通常基于類路徑中的存在和屬性值來條件性地配置應用程序。

主要步驟如下:

  1. 啟動類:每個 Spring Boot 應用都有一個啟動類,通常使用 @SpringBootApplication 注解。這個注解是一個組合的注解,它包含了 @EnableAutoConfiguration,后者是自動配置的關鍵。

  2. @EnableAutoConfiguration:這個注解告訴 Spring Boot 開始掃描候選自動配置類,并應用它們。這些候選自動配置類通常通過 spring.factories 文件存放,該文件位于自動配置模塊的 META-INF/ 目錄下。

  3. 條件注解:自動配置類使用條件注解(如 @ConditionalOnClass@ConditionalOnBean@ConditionalOnProperty 等)來確保只有在特定條件滿足時才應用配置。例如,某個自動配置類可能只在某個類存在于類路徑上時才激活。

  4. 屬性綁定:自動配置過程還涉及將外部配置(如 application.propertiesapplication.yml)綁定到配置類上,進一步定制化自動配置。

相關源碼:

從啟動類開始

啟動類

@SpringBootApplication 注解其實包含三個注解,自動配置相關的是 @EnableAutoConfiguration

@EnableAutoConfiguration

org.springframework.boot.autoconfigure.EnableAutoConfiguration:通過 @Import 導入自動配置模塊的導入選擇器AutoConfigurationImportSelector,它的作用是在啟動時掃描指定包路徑下的所有自動配置類,并根據應用程序的依賴關系和環境變量等信息,自動地選擇需要引入的自動配置類,并將其注冊為 Bean,以便應用程序可以正常使用這些自動配置的功能。

導入自動配置模塊的選擇器AutoConfigurationImportSelector

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#selectImports:該方法的主要作用是從給定的注解元數據中篩選出需要導入的包名。

selectImports方法

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry:用于獲取自動配置項的入口點。該方法接受一個參數,即要獲取的自動配置項的名稱。它返回一個 AutoConfigurationEntry 對象,該對象包含了自動配置項的詳細信息,如類路徑、Bean 定義等。重點看該方法內調用的 getCandidateConfigurations() 方法。

getAutoConfigurationEntry()

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getCandidateConfigurations:這個方法的作用是獲取候選的自動配置類列表。

getCandidateConfigurations()

org.springframework.boot.context.annotation.ImportCandidates#load:通過調用 ImportCandidates.load() 方法,從 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中加載候選的自動配置類,并將其存儲在 configurations 變量中。

ImportCandidates.load()

org.springframework.boot.autoconfigure.AutoConfiguration.imports:存放了 SpringBoot 自動配置類,不同 SpringBoot 版本數量不同。
Spring Boot所有自動配置類
回到 org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#getAutoConfigurationEntry,會對讀到所有的自動配置類進行篩選。
自動配置類進行篩選

org.springframework.boot.autoconfigure.AutoConfigurationImportSelector.ConfigurationClassFilter#filter:篩選條件就是使用條件注解(如 @ConditionalOnClass@ConditionalOnBean@ConditionalOnProperty 等)來確保只有在特定條件滿足時才應用配置。

篩選符合條件的自動配置類

例如符合篩選條件的 org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration 自動配置類,類上帶有 @EnableConfigurationProperties({ServerProperties.class}),既將配置文件(如 application.propertiesapplication.yml)中的屬性綁定到帶有 @ConfigurationProperties 注解的類 ServerProperties.class 對象上,從而達到引入 starter 配置少量參數就能運行的目的。

在這里插入圖片描述

示例:Spring Boot Web 自動配置

假設你想創建一個簡單的 Spring Boot Web 應用。你只需要做以下幾步:

  1. 添加依賴:在 pom.xmlbuild.gradle 文件中添加 Spring Boot Starter Web 依賴。

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
  2. 創建啟動類

    @SpringBootApplication
    public class MyApplication {public static void main(String[] args) {SpringApplication.run(MyApplication.class, args);}
    }
    
  3. 編寫控制器

    @RestController
    public class HelloController {@GetMapping("/")public String hello() {return "Hello, Spring Boot!";}
    }
    
  4. 配置文件

    server.port=8808
    

在這個例子中,spring-boot-starter-web 包含了 Spring MVCTomcat 作為默認的嵌入式服務器,以及其他 Web 開發所需的依賴。當你啟動應用時,Spring Boot 的自動配置會檢測到類路徑上的 spring-webmvc 和嵌入式 Tomcat,并自動配置它們。這意味著你通過少量的配置或默認配置就可以運行一個基本的 Web 應用。

深入理解

  • 自定義自動配置:如果默認的自動配置不符合你的需求,你可以通過添加自定義配置來覆蓋或補充默認配置。此外,你也可以通過排除特定的自動配置類來禁用它們。

  • 條件化配置:理解自動配置背后的條件邏輯對于高效使用 Spring Boot 非常重要。你可以查看特定自動配置類的源碼,以了解它們是如何根據應用的狀態和外部配置做出決策的。

總結

Spring Boot 的自動配置極大簡化了 Spring 應用的配置工作,讓開發者可以專注于應用邏輯的實現,而非繁瑣的配置。通過合理利用自動配置和條件注解,你可以快速地構建出既強大又靈活的 Spring 應用。了解并掌握 Spring Boot 自動配置的原理和使用方法,將有助于你更高效地開發 Spring Boot 應用。

相關閱讀

重學SpringBoot3-@Import注解的作用
重學SpringBoot3-@ConditionalOnXxx條件注解
重學SpringBoot3-@ConditionalOnXxx條件注解
重學SpringBoot3-@EnableConfigurationProperties注解

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

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

相關文章

飛槳(PaddlePaddle)模型保存與加載教程

文章目錄 飛槳&#xff08;PaddlePaddle&#xff09;模型保存與加載教程1. 概述2. 訓練調優場景2.1 保存動態圖模型2.2 加載動態圖模型 3. 推理部署場景3.1 使用基礎API 4. 其他場景4.1 舊版本格式兼容載入4.2 靜態圖模型的保存與加載 5. 總結 飛槳&#xff08;PaddlePaddle&am…

OmniPlan Pro mac版:簡單、智能,項目管理新選擇!

OmniPlan Pro是一款功能強大的項目管理軟件&#xff0c;它以其直觀的用戶界面和豐富的功能&#xff0c;幫助用戶輕松管理各種復雜的項目。無論是個人任務還是團隊協作&#xff0c;OmniPlan Pro都能提供全面的解決方案&#xff0c;讓項目管理變得更加簡單高效。 OmniPlan Pro軟…

從0開始回顧Mysql --- MySQL初體驗

大白話從0開始回顧MySQL&#xff0c;去除了一些繁瑣的操作的演示以及內容&#xff0c;如MySQL安裝等&#xff0c;本篇文章適合復習MySQL語法&#xff0c;學習MySQL語句&#xff0c;對MySQL不太熟練的同學&#xff0c;希望對大家有一些幫助。 MySQL初體驗 首先&#xff0c;我將…

如何在Window系統部署VisualSVN服務并結合cpolar實現無公網ip遠程訪問

文章目錄 前言1. VisualSVN安裝與配置2. VisualSVN Server管理界面配置3. 安裝cpolar內網穿透3.1 注冊賬號3.2 下載cpolar客戶端3.3 登錄cpolar web ui管理界面3.4 創建公網地址 4. 固定公網地址訪問 前言 SVN 是 subversion 的縮寫&#xff0c;是一個開放源代碼的版本控制系統…

數字孿生與智慧交通的融合發展:推動交通行業數字化轉型,構建智慧城市新生態

隨著信息技術的快速發展和城市化進程的深入推進&#xff0c;交通行業正面臨著前所未有的機遇與挑戰。傳統的交通管理模式已難以滿足日益增長的交通需求&#xff0c;而數字化轉型則成為了推動交通行業創新發展的必由之路。數字孿生技術作為一種前沿的信息技術手段&#xff0c;為…

聊一聊腦機接口

截至我所知的信息&#xff0c;腦機接口&#xff08;Brain-Computer Interface, BCI&#xff09;技術正在迅速發展&#xff0c;但仍處于相對早期階段。這一領域的研究涉及神經科學、工程學、計算機科學和人工智能等多個學科。以下是一些關于腦機接口目前進展的要點&#xff1a; …

基于springboot+vue的公寓報修管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

每天的三哥牌小雞腿沒了

查看印度基金(164824)公告&#xff0c;從2024年2月28日起&#xff0c;暫停印度基金的申購&#xff0c;限額100塊的一拖七套利告一段落。這意味著看好印度股市的國內投資者&#xff0c;以后只能通過在場內買入獲得份額。 關于暫停申購的原因&#xff0c;官方說是為保護基金持有…

學Python如此簡單--停車管理模塊

簡介 &#xff08;本停車場一個小時4塊&#xff09; 模塊名稱&#xff1a;黑心停車管理模塊 模塊功能&#xff1a;汽車進場錄入、汽車出場收費 代碼 #進入停車場 def enter():print(歡迎進入黑心停車場)#模擬識別車牌號car_number input(請輸入車牌號:)t 0 #停車時間car…

重磅!交通領域頂級會議TRB會議將進行重大改革

美國交通研究委員會年會&#xff08;Transportation Research Board annual meeting,以下簡稱TRB會議&#xff09;是由美國交通研究委員會舉辦的交通領域的國際頂級會議。該會議每年舉辦一次&#xff0c;在華盛頓特區召開。TRB會議是交通研究領域知名度最高的學術會議之一&…

安裝 node 錯誤的配置環境變量之后使用 npm 報錯

安裝 node 錯誤的配置環境變量之后使用 npm 報錯 node:internal/modules/cjs/loader:1147 throw err; ^ Error: Cannot find module ‘F:\ACodeTools\Node\node_modules\npm\bin\node_modules\npm\bin\npm-cli.js’ at Module._resolveFilename (node:internal/modules/cjs/loa…

基于springboot實現企業員工績效考評系統項目【項目源碼+論文說明】

基于springboot實現企業員工績效考評系統演示 摘要 時代的變化速度實在超出人類的所料&#xff0c;21世紀&#xff0c;計算機已經發展到各行各業&#xff0c;各個地區&#xff0c;它的載體媒介-計算機&#xff0c;大眾稱之為的電腦&#xff0c;是一種特高速的科學儀器&#xf…

AI-數學-高中-32-統計-樣本空間與隨機事件

原作者視頻&#xff1a;【概率】【一數辭典】1樣本空間與隨機事件_嗶哩嗶哩_bilibili 1.隨機試驗&#xff1a; 2.樣本點、樣本空間、有限樣本空間&#xff1a; 示例1 示例2 3.事件&#xff1a; 示例&#xff1a;

[DEBUG] spring boot-如何處理鏈接中的空格等特殊字符

問題&#xff1a; get或者post中提交的內容可能有空格、#等特殊字符&#xff0c;不做處理的話可能解析錯誤。 解決&#xff1a; html中&#xff1a; <a th:href"{/listSgrna(id${item.getGeneId()},geneName${item.getGeneName()},genome${genome},sgrnaNum${sgrnaN…

Qt CMake 國際化相關配置

文章目錄 更新ts文件發布ts文件 本來用qmake使用pro文件很簡單的一件事&#xff0c;結果用cmake折騰了半天。 何必呢~ 參考&#xff1a;QT6.3 CMake 多語言切換 這是我的 cmake_minimum_required(VERSION 3.16)project(testQml3_6 VERSION 0.1 LANGUAGES CXX)set(CMAKE_AUTO…

06.QT信號和槽-1

一、信號和槽概述 在Qt中&#xff0c;用戶和控件的每次交互過程稱為一個事件。比如"用戶點擊按鈕"是一個事件&#xff0c;"用戶關閉窗口"也是一個事件。每個事件都會發出一個信號&#xff0c;例如用戶點擊按鈕會發出"按鈕被點擊"的信號&#xff…

Java練習(第5天)【總結】在字符串中尋找特定的字符(5種方法)

問題描述&#xff1a;在字符串中尋找特定字符 1、第1次出現位置 實現函數原型&#xff1a; int indexOf(char c) Java代碼&#xff1a; import java.io.*; public class Way_1 {public static void main(String args[]){String str "Geeks for Geeks is a computer s…

疲勞駕駛監測報警攝像機

疲勞駕駛是導致交通事故的重要原因之一&#xff0c;為了提高駕駛安全性&#xff0c;科技日新月異&#xff0c;疲勞駕駛監測報警攝像機因其先進的技術而成為關注焦點。 疲勞駕駛監測報警攝像機采用先進的人臉識別技術和人工智能算法&#xff0c;能夠實時監測駕駛員的狀態。通過對…

基于Python淘寶水果銷售數據可視化系統設計與實現(Django框架) 研究背景與意義、國內外研究現狀

博主介紹&#xff1a;黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者&#xff0c;CSDN博客專家&#xff0c;在線教育專家&#xff0c;CSDN鉆石講師&#xff1b;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

文件操作和IO(2):Java中操作文件

目錄 一、File的屬性 二、File的構造方法 三、File的方法 四、代碼示例 1、getName&#xff0c;getParent&#xff0c;getPath方法 2、getAbsolutePath&#xff0c;getCanonicalPath方法 3、exists&#xff0c;isDirectory&#xff0c;createNewFile方法 4、createNewF…