Javaweb之SpringBootWeb案例之自動配置的原理分析的詳細解析

3.2.3 原理分析
3.2.3.1 源碼跟蹤

前面我們講解了在項目當中引入第三方依賴之后,如何加載第三方依賴中定義好的bean對象以及配置類,從而完成自動配置操作。那下面我們通過源碼跟蹤的形式來剖析下SpringBoot底層到底是如何完成自動配置的。

源碼跟蹤技巧:

在跟蹤框架源碼的時候,一定要抓住關鍵點,找到核心流程。一定不要從頭到尾一行代碼去看,一個方法的去研究,一定要找到關鍵流程,抓住關鍵點,先在宏觀上對整個流程或者整個原理有一個認識,有精力再去研究其中的細節。

要搞清楚SpringBoot的自動配置原理,要從SpringBoot啟動類上使用的核心注解@SpringBootApplication開始分析:

在@SpringBootApplication注解中包含了:

  • 元注解(不再解釋)

  • @SpringBootConfiguration

  • @EnableAutoConfiguration

  • @ComponentScan

我們先來看第一個注解:@SpringBootConfiguration

@SpringBootConfiguration注解上使用了@Configuration,表明SpringBoot啟動類就是一個配置類。

@Indexed注解,是用來加速應用啟動的(不用關心)。

接下來再先看@ComponentScan注解:

@ComponentScan注解是用來進行組件掃描的,掃描啟動類所在的包及其子包下所有被@Component及其衍生注解聲明的類。

SpringBoot啟動類,之所以具備掃描包功能,就是因為包含了@ComponentScan注解。

最后我們來看看@EnableAutoConfiguration注解(自動配置核心注解):

使用@Import注解,導入了實現ImportSelector接口的實現類。

AutoConfigurationImportSelector類是ImportSelector接口的實現類。

AutoConfigurationImportSelector類中重寫了ImportSelector接口的selectImports()方法:

selectImports()方法底層調用getAutoConfigurationEntry()方法,獲取可自動配置的配置類信息集合

?

getAutoConfigurationEntry()方法通過調用getCandidateConfigurations(annotationMetadata, attributes)方法獲取在配置文件中配置的所有自動配置類的集合

?

getCandidateConfigurations方法的功能:

獲取所有基于META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件、META-INF/spring.factories文件中配置類的集合

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件和META-INF/spring.factories文件這兩個文件在哪里呢?

  • 通常在引入的起步依賴中,都有包含以上兩個文件

在前面在給大家演示自動配置的時候,我們直接在測試類當中注入了一個叫gson的bean對象,進行JSON格式轉換。雖然我們沒有配置bean對象,但是我們是可以直接注入使用的。原因就是因為在自動配置類當中做了自動配置。到底是在哪個自動配置類當中做的自動配置呢?我們通過搜索來查詢一下。

在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports配置文件中指定了第三方依賴Gson的配置類:GsonAutoConfiguration

第三方依賴中提供的GsonAutoConfiguration類:

在GsonAutoConfiguration類上,添加了注解@AutoConfiguration,通過查看源碼,可以明確:GsonAutoConfiguration類是一個配置。

看到這里,大家就應該明白為什么可以完成自動配置了,原理就是在配置類中定義一個@Bean標識的方法,而Spring會自動調用配置類中使用@Bean標識的方法,并把方法的返回值注冊到IOC容器中。

自動配置源碼小結

自動配置原理源碼入口就是@SpringBootApplication注解,在這個注解中封裝了3個注解,分別是:

  • @SpringBootConfiguration

    • 聲明當前類是一個配置類

  • @ComponentScan

    • 進行組件掃描(SpringBoot中默認掃描的是啟動類所在的當前包及其子包)

  • @EnableAutoConfiguration

    • 封裝了@Import注解(Import注解中指定了一個ImportSelector接口的實現類)

      • 在實現類重寫的selectImports()方法,讀取當前項目下所有依賴jar包中META-INF/spring.factories、META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports兩個文件里面定義的配置類(配置類中定義了@Bean注解標識的方法)。

當SpringBoot程序啟動時,就會加載配置文件當中所定義的配置類,并將這些配置類信息(類的全限定名)封裝到String類型的數組中,最終通過@Import注解將這些配置類全部加載到Spring的IOC容器中,交給IOC容器管理。

最后呢給大家拋出一個問題:在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件中定義的配置類非常多,而且每個配置類中又可以定義很多的bean,那這些bean都會注冊到Spring的IOC容器中嗎?

答案:并不是。 在聲明bean對象時,上面有加一個以@Conditional開頭的注解,這種注解的作用就是按照條件進行裝配,只有滿足條件之后,才會將bean注冊到Spring的IOC容器中(下面會詳細來講解)

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

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

相關文章

[VSCode插件] 輕量級靜態博客 - MDBlog

MDBlog VSCode插件,基于Markdown的輕量級靜態博客系統,同時支持導出為可以部署的靜態博客。 倉庫 MDBlog 1. Features 博客基礎功能:分類管理、文章管理、自動生成索引快捷指令:快捷輸入表格、mermaid、wavedrom、代碼塊發布&a…

[electron雜項] 記錄學習electron碰到問題(持續更新)

無法生成 node_modules文件夾 如前面所說的,如果要用vscode的代碼補全,那么就要把 electron.d.ts文件拷貝到項目的 node_modules文件夾下。一般情況下是通過npm install生成 node_modules 文件夾。但是有時發現根本生成不了生成了一個 xxxxlock的文件。…

Redis--內存回收機制詳解

什么是內存回收機制? 眾所周知Redis之所以性能高是因為數據都存在內存中,內存是很寶貴的,Redis的內存回收機制本質就是處理達到過期時間的key-value,以及當內存到達最大使用值時候觸發的內存淘汰策略。 Redis數據刪除的策略有哪些&#xf…

軟考重點題解析-基礎知識

1.加密技術:分為對稱加密技術:文件的加密和解密使用相同的密鑰 和 非對稱加密技術:加密和解密不同的密鑰,分別是公開密鑰和私有密鑰。 例題:若A,B兩人分別在認證機構(CA)M,N處獲得證書&…

項目準備March

Nginx主要用來作為Http服務器,要實現Tomcat的負載均衡,就可以通過Nginx來實現。 正向代理代理的是客戶端,反向代理代理的是服務端。SpringBoot采用約定優于配置的思想,簡化Spring項目的配置開發。 前端請求其實并未直接發送到后…

php連接hdfs初步探索

一、phdfs拓展 結果:暫時舍棄 安裝此拓展時,無法make成功,因為缺少hdfs.n文件。 換了其他版本的拓展包,并編譯都沒有找到此文件。 后搜到官網的相關資料,此hdfs.h的文件路徑的地址是$HADOOP_HDFS_HOME/include/hdfs…

數據增加

目錄 增加數據 實現數據增加,保存新的內容 注意 Oracle從入門到總裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 增加數據 由于 emp 表中的數據對日后的開發依然有用處,所以在講解更新之前 建議將emp 表數據做一個復制。將…

linux如何查看磁盤占用情況

要查看Linux系統中磁盤的占用情況,可以使用一些命令來獲取相關信息。以下是一些常用的命令: df命令: df命令用于顯示文件系統的磁盤空間使用情況,包括磁盤分區的總空間、已用空間、可用空間等信息。 df -h使用 -h 參數可以以人類可…

Golang 簡介與基本語法學習

Go,也被稱為 Golang,是一門由 Google 設計的開源編程語言。它旨在提供高效的開發體驗,同時具備并發性、內存安全和簡潔性。本篇博客將介紹 Golang 的基本語法和一些示例,幫助讀者快速入門這門令人著迷的語言。 簡介 Go 語言的設…

一個腳本兩步計算材料Raman譜(附數據處理和繪圖腳本)

在以往推送中已經介紹了相當多的計算材料Raman的方法,使用的軟件主要為Phonopy-Spectroscopy,相關軟件還有vasp,phonopy,phono3py等。 Phonopy-Spectroscopy計算材料紅外和Raman光譜 Phonopy-Spectroscopy 計算紅外和拉曼光譜 也…

經典面試題從瀏覽器輸入URL到頁面加載的過程?

從輸入URL到頁面加載的過程涉及多個步驟,包括DNS解析、TCP連接、發送HTTP請求、服務器處理請求、瀏覽器解析渲染頁面以及斷開連接。具體如下: DNS解析:當你在瀏覽器中輸入一個URL時,瀏覽器首先需要將域名轉換為IP地址。這個過程稱…

QT中提升為自定義控件的方法

一.介紹 提升為自定義的控件用法:先要寫好自定義控件后,再添加,在頻繁使用同一控件時,的確非常的高效。 同時導入別人開發的控件操作方法也類似。 二.下面以自定義的QPushButton作一個很簡單的例子&#x…

MongoDB聚合運算符:$bottomN

$bottomN聚合運算符返回分組中指定順序的最后n個元素&#xff0c;如果分組中的元素數量小于n&#xff0c;則返回分組的全部元素。從MongoDB5.2開始支持。 語法 {$bottomN:{n: <expression>,sortBy: { <field1>: <sort order>, <field2>: <sort or…

精品SSM的教學管理系統課程作業成績

《[含文檔PPT源碼等]精品基于SSM的教學管理系統[包運行成功]》該項目含有源碼、文檔、PPT、配套開發軟件、軟件安裝教程、項目發布教程、包運行成功&#xff01; 軟件開發環境及開發工具&#xff1a; Java——涉及技術&#xff1a; 前端使用技術&#xff1a;HTML5,CSS3、Jav…

esp32 C3和S3 開發板電流對比

出去好奇用合宙家的 lot power 測了兩塊開發板的運行電流。 esp32 S3 (嘉立創開發板 8N8 版本) 模式 電流downloa模式49 毫安空代碼91 毫安light mode27 毫安deep mode25 毫安delay 40 毫安 esp32 C3 無串口芯片 &#xff08;合宙 9.9 元版本&#xff09; 模式 …

uniapp npx update-browserslist-db@lates 問題解決

在uniapp運行項目時&#xff0c;會有這種報錯&#xff0c;其實這是表明browserslistlatest版本低了&#xff0c;在催你升級版本&#xff0c;browserslistlatest是用來支持解析css用的&#xff0c;當然&#xff0c;你也可以直接忽略這個報錯提示&#xff0c;也可以正常運行項目。…

探索數據結構:深入了解順序表的奧秘

?? 歡迎大家來到貝蒂大講堂?? &#x1f388;&#x1f388;養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; 所屬專欄&#xff1a;數據結構與算法 貝蒂的主頁&#xff1a;Betty’s blog 1. 什么是順序表 順序表是用一段物理地址連續的存儲單元依次存儲數據元…

【初中生講機器學習】13. 決策樹算法一萬字詳解!一篇帶你看懂!

創建時間&#xff1a;2024-03-02 最后編輯時間&#xff1a;2024-03-02 作者&#xff1a;Geeker_LStar 你好呀~這里是 Geeker_LStar 的人工智能學習專欄&#xff0c;很高興遇見你~ 我是 Geeker_LStar&#xff0c;一名初三學生&#xff0c;熱愛計算機和數學&#xff0c;我們一起加…

取送貨問題(Pickup and Delivery Problem)

取送貨問題及其變體 廣義取送貨問題&#xff08;General Pickup and Delivery Problems&#xff0c;GPDP&#xff09;可以分為兩類&#xff1a; Vehicle Routing Problems with Backhauls&#xff0c;VRPB&#xff1a;從配送中心&#xff08;depot&#xff09;取貨運輸貨物到客…

測試/測試開發八股——找大廠測試實習基礎篇

第一部分:基礎概念 1. 軟件測試是什么? 在規定的條件下對一個產品或者程序進行操作,以發現程序錯誤,衡量軟件質量,并對其是否能滿足設計要求進行評估的過程。 軟件測試工程師的任務 2. 軟件測試工程師的任務 軟件測試工程師主要工作是檢查軟件是否有bug、是否具有穩定…