08、SpringBoot 源碼分析 - 自動配置深度分析一

SpringBoot 源碼分析 - 自動配置深度分析一

  • refresh和自動配置大致流程
  • 如何自動配置
  • SpringBootApplication注解
    • EnableAutoConfiguration注解
      • AutoConfigurationImportSelector自動配置導入選擇器
      • DeferredImportSelectorHandler的handle
      • DeferredImportSelectorGroupingHandler的register注冊DeferredImportSelectorHolder
      • DeferredImportSelectorGrouping

refresh和自動配置大致流程

在這里插入圖片描述

如何自動配置

我們看下這段代碼,紅色框是什么放入的注冊類,其實這就是我們要注冊的配置類,自動裝配跟他有關:

public static void main(String[] args) {SpringApplication.run(SpringBootLearnApplication.class, args);}

為什么呢,因為他頭上有注解 SpringBootApplication

@SpringBootApplication
public class SpringBootLearnApplication

所以其實你只要傳一個頭上有這個注解的類就可以了,不一定要是main方法的類。

SpringBootApplication注解

那為什么就有這個注解就能自動配置呢,我們來看看這個注解,其他你可以不管,但是EnableAutoConfiguration你得看:
在這里插入圖片描述
首先這個是一個配置類,可以被解析,因為有SpringBootConfiguration注解,被Configuration注解了:
在這里插入圖片描述
這樣我們的SpringBootApplication就類似于我們經常配置的java配置類。有了這個前提,我們就可以先看這個配置類的解析過程,其實就是ConfigurationClassPostProcessor的解析處理,解析流程我以前的spring源碼文章都講過,其中processImports的處理也特別講過,會先遞歸獲取所有import進來的類,然后按不同類型進行判斷處理,重點就是這里啦,我們先來看下EnableAutoConfiguration注解是不是有import呢。

EnableAutoConfiguration注解

在這里插入圖片描述
有個AutoConfigurationImportSelectorimport,其實還有一個在AutoConfigurationPackage注解里,暫時不說,重點是AutoConfigurationImportSelector

AutoConfigurationImportSelector自動配置導入選擇器

看下他的結構,左邊不用管,就是為了回調拿到一些屬性,好對容器操作,主要是右邊,我們前面spring的文章講過ImportSelector的原理,想看的朋友可以看下這篇文章,有這個基礎對下面的理解比較好,因為這里還有個DeferredImportSelector,他會在ConfigurationClassParser解析方法的最后來處理。
在這里插入圖片描述
可以看到,他被處理的時候:
在這里插入圖片描述
DeferredImportSelectorHandler就是專門來處理這些DeferredImportSelector的。

DeferredImportSelectorHandler的handle

首先會封裝一個持有器DeferredImportSelectorHolder,如果deferredImportSelectors為空,表示在被DeferredImportSelectorGroupingHandler處理中,DeferredImportSelectorGroupingHandler又是什么呢,其實我們要處理的DeferredImportSelectorHolder會根據Group進行分組,來區分不同的ImportSelector,比如我們這個自動裝配的AutoConfigurationImportSelector,是屬于AutoConfigurationGroup類型的,分組處理方便,到時候只需要遍歷所有組中的ImportSelector統一處理即可。因為處理的方式是迭代器循環,所以不能添加,只能直接處理,當然如果不為空,表示沒有在處理,可以添加到deferredImportSelectors集合里。

		public void handle(ConfigurationClass configClass, DeferredImportSelector importSelector) {DeferredImportSelectorHolder holder = new DeferredImportSelectorHolder(configClass, importSelector);if (this.deferredImportSelectors == null) {//直接處理DeferredImportSelectorGroupingHandler handler = new DeferredImportSelectorGroupingHandler();handler.register(holder);handler.processGroupImports();}else {this.deferredImportSelectors.add(holder);//添加}}

DeferredImportSelectorGroupingHandler的register注冊DeferredImportSelectorHolder

可以看到組處理器里面會有一個groupings 映射,就是來存放Group類別和DeferredImportSelectorGrouping映射的,同一個Group類別里面可以很多個DeferredImportSelectorGrouping,因為DeferredImportSelectorGrouping里面有集合。

		//自動裝配類型和組映射private final Map<Object, DeferredImportSelectorGrouping> groupings = new LinkedHashMap<>();//注解屬性和配置類的映射private final Map<AnnotationMetadata, ConfigurationClass> configurationClasses = new HashMap<>();//注冊分組public void register(DeferredImportSelectorHolder deferredImport) {Class<? extends Group> group = deferredImport.getImportSelector().getImportGroup();DeferredImportSelectorGrouping grouping = this.groupings.computeIfAbsent((group != null ? group : deferredImport),key -> new DeferredImportSelectorGrouping(createGroup(group)));//創建組grouping.add(deferredImport);//創建一個組,并加入DeferredImportSelectorHolderthis.configurationClasses.put(deferredImport.getConfigurationClass().getMetadata(),deferredImport.getConfigurationClass());//將注解屬性和ConfigurationClass映射}

DeferredImportSelectorGrouping

這里就是同一個組的會添加進deferredImports集合。
在這里插入圖片描述
其實是比較繞的,繞了幾層,我畫個圖看了清晰:
在這里插入圖片描述

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

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

相關文章

【學習筆記】C++每日一記[20240520]

簡述幾種內存泄漏的預防機制 用智能指針代替普通指針&#xff0c;由于智能指針自帶引用計數功能&#xff0c;能夠記錄動態分配空間的引用數量&#xff0c;在引用計數為零時&#xff0c;自動調用析構函數釋放空間。 借助一些內存泄漏檢測工具&#xff0c;例如Valgrind、Memche…

DNS 解析過程

文章目錄 簡介特點查詢方式??1. 瀏覽器緩存2. 系統緩存&#xff08;hosts文件&#xff09;3. 路由器緩存4. 本地域名服務器5. 根域名服務器6. 頂級域名服務器7. 權限域名服務器8. 本地域名服務器緩存并返回9. 操作系統緩存并返回10. 瀏覽器緩存并訪問流程圖 總結 簡介 DNS&a…

Enable Full Line suggestions 啟用全行建議

開啟后效果如下&#xff1a; 直接提示可能要輸入的參數

基于 Solana 的 Drift Protocol 快速崛起,重新定義去中心化衍生品市場

隨著區塊鏈技術的快速發展&#xff0c;加密市場的格局正在悄然改變。投資者對透明度、效率和去中心化的需求愈發強烈&#xff0c;之前完全由中心化交易主導的加密貨幣交易&#xff0c;開始向鏈上轉移。 根據 Coingecko 的最新數據&#xff0c;CEX 和 DEX 的現貨交易量已經達到了…

WWW24因果論文(3/8) |通過因果干預實現圖分布外泛化

【摘要】由于圖神經網絡 (GNN) 通常會隨著分布變化而出現性能下降&#xff0c;因此分布外 (OOD) 泛化在圖學習中引起了越來越多的關注。挑戰在于&#xff0c;圖上的分布變化涉及節點之間錯綜復雜的互連&#xff0c;并且數據中通常不存在環境標簽。在本文中&#xff0c;我們采用…

系統開發與運行知識

系統開發與運行知識 導航 文章目錄 系統開發與運行知識導航一、軟件工程二、軟件生命周期三、開發模型四、開發方法五、需求分析結構化分析 六、數據流圖分層數據流圖的畫法設計注意事項 七、數據字典數據字典的內容 八、系統設計九、結構化設計常用工具十、面向對象十一、UML…

C++中Lambda表達式的使用場景

Lambda表達式在C中有許多常用的使用場景&#xff0c;下面舉例說明幾個常見的場景&#xff1a; STL算法中的自定義比較器&#xff1a;在使用STL算法時&#xff0c;有時需要自定義比較器來指定元素的排序規則。Lambda表達式可以方便地定義簡單的比較器&#xff0c;例如在std::so…

B+樹和B*樹

B樹和B*樹 一、B樹的簡單介紹二、B樹的插入過程三、B*樹的簡單介紹四、B樹、B樹、B*樹總結五、B樹的應用1、MyISAM索引實現2、InnoDB索引實現 一、B樹的簡單介紹 B樹是B樹的變形&#xff0c;是在B樹基礎上優化的多路平衡搜索樹&#xff0c;B樹的規則跟B樹基本類似&#xff0c;但…

芯片固定uv膠有什么優點?

芯片固定uv膠有什么優點&#xff1f; 芯片固定UV膠具有多種優點&#xff0c;這些優點使得它在半導體封裝和芯片固定等應用中成為理想的選擇。以下是芯片固定UV膠的一些主要優點&#xff1a; 固化速度快&#xff1a;UV膠在紫外線照射下能迅速固化&#xff0c;通常在幾秒到幾十秒…

springcloud-服務拆分與遠程調用

一 微服務 1.1簡單了解 SpringCloud SpringCloud是目前國內使用最廣泛的微服務框架。官網地址&#xff1a;Spring Cloud。 SpringCloud集成了各種微服務功能組件&#xff0c;并基于SpringBoot實現了這些組件的自動裝配&#xff0c;從而提供了良好的開箱即用體驗&#xff1a…

ubuntu24.04LVM擴容問題

目錄 一、 開機前設置&#xff1a;擴展 二、 開機后設置&#xff1a;分區管理 通過gparted管理分區有效做法。 一、 開機前設置&#xff1a;擴展 虛擬機關機。打開虛擬機設置。 掛起狀態是不能擴容的 這里選擇擴容到40G 二、 開機后設置&#xff1a;分區管理 使用gpar…

【Java基礎】IO流(2) —— 字符流

【Java基礎】IO流(1) —— 簡介 【Java基礎】IO流(2) —— 字符流 【Java基礎】IO流(3) —— 字節流 【Java基礎】IO流(4) —— 轉換流、打印流 【Java基礎】IO流(5) —— 序列流、內存流 【Java基礎】IO流(6) —— 隨機訪問文件流、數據流 字符流 文件流 文件輸出流 FileW…

英語學習筆記20——Look at them!

Look at them! 看看他們&#xff01; 詞匯 Vocabulary big a. 大的&#xff08;尺寸&#xff0c;年齡&#xff0c;音量……&#xff09; 搭配&#xff1a;big cheese 大人物    big mouth 大嘴巴&#xff08;傳話的人&#xff09;    big talker 吹牛的人 例句&#xf…

【jest - 禁止自動跑test】

最近使用vscode&#xff0c;保存文件時&#xff0c;默認會觸發自動跑test&#xff0c;很煩人&#xff0c;記錄下配置如何配置關閉禁止自動跑jest測試。 打開setting.json&#xff0c;加上下面這句話&#xff0c;即可關閉自動跑 {"jest.runMode": "on-demand&q…

STL源碼刨析:序列式容器之list

目錄 1.前言 2.list的節點定義和結構 3.list的迭代器定義和結構 4.list的定義和結構 5.list的內存管理 6.list的元素操作 前言 在刨析了vector容器的源碼后&#xff0c;list容器相比與vector容器&#xff0c;其元素的插入和刪除較快&#xff0c;不需要對原本容器中的元…

[9] CUDA性能測量與錯誤處理

CUDA性能測量與錯誤處理 討論如何通過CUDA事件來測量它的性能如何通過CUDA代碼進行調試 1.測量CUDA程序的性能 1.1 CUDA事件 CPU端的計時器可能無法給出正確的內核執行時間CUDA事件等于是在你的CUDA應用運行的特定時刻被記錄的時間戳&#xff0c;通過使用CUDA事件API&#…

UVa1466/LA4849 String Phone

UVa1466/LA4849 String Phone 題目鏈接題意分析AC 代碼 題目鏈接 本題是2010年icpc亞洲區域賽大田賽區的G題 題意 平面網格上有n&#xff08;n≤3000&#xff09;個單元格&#xff0c;各代表一個重要的建筑物。為了保證建筑物的安全&#xff0c;警察署給每個建筑物派了一名警察…

MFC 用Imm類庫實現輸入法修改輸入模式

1.導入Imm類庫&#xff0c;電腦里都有 #include <Imm.h> #pragma comment(lib, "imm32.lib")2.在想要的地方增加代碼 HIMC himc ImmGetContext(m_hWnd);if (himc ! NULL) {ImmSetOpenStatus(himc, TRUE);ImmNotifyIME(himc, NI_COMPOSITIONSTR, CPS_CANCEL,…

時代終結,微軟宣布淘汰VBScript;Flink漏洞被廣泛利用;Grandoreiro銀行木馬強勢回歸,1500多家銀行成攻擊目標 | 安全周報0524

揭秘SolarMarker惡意軟件&#xff1a;多層次基礎設施讓清除工作陷入困境 Recorded Future的新發現表明&#xff0c;SolarMarker信息竊取惡意軟件背后的持續威脅行為者已經建立了一個多層次的基礎設施&#xff0c;以使執法部門的清除工作變得復雜。 該公司在上周發布的一份報告…

SwiftUI中AppStorage的介紹使用

在Swift中&#xff0c;AppStorage是SwiftUI中引入的一個屬性包裝器&#xff0c;在這之前我們要存儲一些輕量級的數據采用UserDefaults進行存取。而AppStorage用于從UserDefaults中讀取值&#xff0c;當值改變時&#xff0c;它會自動重新調用視圖的body屬性。也就是說&#xff0…