springboot starter工作原理_98,談談SpringBoot的工作原理

對技術的探索,一切源于好奇心,保持好奇心,才能讓人更年輕。

至今,我們已經有了很多創建SpringBoot項目的經驗,比如我們要創建一個支持web開發的項目,我們只需要引入web-starter模塊即可。

那么,SpringBoot為什么這么神奇?引入的依賴變少了,配置文件也不見了,但項目卻可以正常運行。下面我們一起來探究這背后的邏輯:

1,為什么依賴的依賴變少了?SpringBoot是如何管理這些依賴的?

我們分兩個點來看起

1.1 從pom文件出發

首先,是有一個父工程的引用

dc7a4c04966009d038db0b773b4116e8.png

我們繼續往里面跟蹤,發現父工程又依賴于另一個父工程

1869bf434081cb73c8cc0df6cb3bd452.png

繼續跟蹤,發現這是一個pom工程,統一控制版本

19a4cf3261e93ababdaf37b1c09fc232.png

定義了一堆第三方jar包的版本

a164b489dce1e2aa7ee2c9ca8c8a99f2.png

結論:

所有我們使用了SpringBoot之后,由于父工程有對版本的統一控制,所以大部分第三方包,我們無需關注版本,個別沒有納入SpringBoot管理的,才需要設置版本號

1.2 SpringBoot將所有的常見開發功能,分成了一個個場景啟動器(starter),這樣我們需要開發什么功能,就導入什么場景啟動器依賴即可。

比如,我們現在要開發web項目,所以我們導入了spring-boot-starter-web

2072db31fa670218dbf14bb72ddf0d74.png

我們來跟蹤看看,內部也復用一些starter

7f7a213903b74cd1b1b7c16f6d67c599.png

還有Springweb和SpringMVC,這也就是為什么,我們就可以開發SpringWeb程序的原因

562b32accb47db7858004a09a3adbeca.png

結論:

  • 大家會發現,SpringBoot是通過定義各種各樣的Starter來管理這些依賴的
  • 比如,我們需要開發web的功能,那么引入spring-boot-starter-web
  • 比如,我們需要開發模板頁的功能,那么引入spring-boot-starter-thymeleaf
  • 我們需要整合redis,那么引入spring-boot-starter-data-redis
  • 我們需要整合amqp,實現異步消息通信機制,那么引入spring-boot-starter-amqp
  • 等等,就是這么方便

2,為什么我們不需要配置?

我們來看看SpringBoot的啟動類代碼,除了一個關鍵的注解,其他都是普通的類和main方法定義

313e13815935cfb9833f1068efe05982.png

那么,我們來觀察下這個注解背后的東西,發現,這個注解是一個復合注解,包含了很多的信息

4d138b0af9f911b8e08f35a869e03e3a.png

其他注解都是一個注解的常規配置,所以關鍵看圈中的這兩個

我們來分析第一個關鍵注解:@SpringBootConfiguration

我們可以看到,內部是包含了@Configuration,這是Spring定義配置類的注解

而@Configuration實際上就是一個@Component,表示一個受Spring管理的組件

14186825570e5f0db913dce7f92d525e.png

結論:@SpringBootConfiguration這個注解只是更好區分這是SpringBoot的配置注解,本質還是用了Spring提供的@Configuration注解

我們再來探討下一個注解:@EnableAutoConfiguration

這個注解的作用是告訴SpringBoot開啟自動配置功能,這樣就減少了我們的配置

那么具體是怎么實現自動配置的?

我們先來觀察這個注解背后的內容

f7575fee806805f5ff541ac7add3227f.png

所以,又到了分析圈中的兩個注解了

先來分析@AutoConfigurationPackage

觀察其內部實現,內部是采用了@Import,來給容器導入一個Registrar組件

4b070c475a9c16e9af33e1169758026e.png

所以,我們繼續往下跟蹤,來看Registrar內部是什么情況?

73f95ec8b9df87a807e5bc32dd6fb66f.png

我們可以跟蹤源碼看看這段是什么信息

0fa585013df748492099202af945d1aa.png

結論:

通過源碼跟蹤,我們知道,程序運行到這里,會去加載啟動類所在包下面的所有類

這就是為什么,默認情況下,我們要求定義的類,比如controller,service必須在啟動類的同級目錄或子級目錄的原因

再來分析@Import(AutoConfigurationImportSelector.class)

這個的關鍵是來看AutoConfigurationImportSelector.class內部的細節

在這個類的內部,有一個關鍵的方法,我們可以調試來看看結果

550183db3e483b47a5e3331b1ce635f6.png

發現默認加載了好多的自動配置類,這些自動配置類,會自動給我們加載每個場景所需的所有組件,并配置好這些組件,這樣就省去了很多的配置

07ea06fd2556e805f4aec11dccf29265.png

好了,今天就寫到這,祝大家周末愉快,每天都能增值一點點!

有更多的時間去做自己喜歡的事。

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

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

相關文章

精英主義 遺傳算法 matlab,遺傳算法優化 - osc_lfs4vsih的個人空間 - OSCHINA - 中文開源技術交流社區...

1.遺傳算法簡介遺傳算法是一種基于自然選擇和群體遺傳機理的搜索算法,它模擬了自然選擇和自然遺傳過程中的繁殖、雜交和突變現象.再利用遺傳算法求解問題時,問題的每一個可能解都被編碼成一個“染色體”,即個體,若干個個體構成了群體(所有可能解).在遺傳算法開始時,總是隨機的產…

python 類靜態屬性_如何從Python中的類中引用靜態屬性?

您面臨的問題是因為您不了解類聲明的作用域是如何工作的。類聲明在其自己的作用域內執行。執行完成后,將創建一個新的類對象,并將獲得的范圍作為其__dict__附加到該類。在注意:類范圍是從方法范圍內搜索的而不是!這意味著當在方法…

php后臺管理員登錄密碼錯誤,如果后臺管理員的密碼錯誤,我該怎么辦,還有兩種找回密碼的方法...

Dedecms是中國著名的網站管理核心. 由于編織夢想簡單易用,因此可以進行二次開發,并且可以實現各種網站. 在使用dedecms的過程中,如果忘記了夢想管理后臺的密碼怎么辦?神山個人博客分享了兩種修改(重置)管理員密碼的方法.1. 下載織…

python logging模塊 默認_python logging模塊

函數式簡單配置importlogginglogging.debug(debug message) #計算或者工作的細節logging.info(info message) #記錄一些用戶的增刪改查的操作logging.warning(warning message) #警告操作logging.error(error message) #警告操作logging.critical(critical message) #批判的 直…

mac安裝多php環境變量配置,Mac如何安裝多個php版本

Mac安裝多個php版本的方法:首先打開Mac上的終端工具,并確認安裝Homebrew;然后安裝【php5.5】及對應擴展;最后執行指令【brew unlink php55】刪除brew中php的軟鏈即可。Mac安裝多個php版本的方法:1、打開Mac上的終端工具…

phpexcel 獲取工作簿名稱_工作分享 | Excel快速匯總考勤

點擊藍字關注我們每月月底,各位同事把考勤表報到部門后,檢查核對再匯總一份總考勤表上報,傳統的復制粘貼總是占用不少時間,還容易出錯。為提高工作效率,現利用Excel實現考勤快速匯總。01 統一考勤模板,每個…

php進程通訊方式,PHP進程模型、進程通訊方式、進程線程的區別分別有哪些?

PHP進程模型是一個正在執行的程序,可以分配給處理器并由處理器執行的一個實體;PHP進程通訊方式有管道及有名管道,信號,共享內存等;PHP進程線程的區別有進程是資源的分配和調度的一個獨立單元,而線程是CPU調…

iphone怎樣關閉副屏_小米新設計專利曝光:“Z”型折疊屏手機

折疊屏手機可以說是最近幾年的熱門話題,雖然并未大面積普及,但已有多家廠商量產上市了旗下的折疊屏手機。同樣作為知名廠商的小米,曾在此前展示過旗下的折疊屏手機視頻,但并未真正發布。而近日曝光的一份小米旗下專利設計則表明小…

php socket開發斗地主,基于狀態機模型的斗地主游戲(NodeJsSocketIO)

1. 系統結構系統考慮使用Nodejs和SocketIo實現服務器端邏輯,前端使用HTML5。2. 邏輯流程1 . 主要邏輯包括用戶進入游戲、等待對家進入游戲、游戲過程、結束統計這4個過程。2 . 游戲過程的邏輯具體如下3 . 服務器-客戶端通訊邏輯如下3. 客戶端界面設計1 . 登錄界面2 …

python幾何拼貼畫_圖形幾何圖形拼貼畫

四邊形教學內容:教材第34頁?——36頁教學目標:1.直觀感知四邊形,能區分和辨認四邊形,知道四邊形的特征.進一步認識長方形和正方形,知道它們的角都是直角.2.通過畫一畫、找一找、拼一拼等活動,培養學生[此文轉于斐斐課件園?FFKJ.Net]的觀察比較和概括抽象的能力,發展空間想象能…

wgs84轉經緯度_wgs84經緯度轉為cgcs2000平面坐標

航拍測繪中,pos數據多數是wgs84,而GCP坐標是2000或者80坐標。有如下2情況需要轉換坐標,1.不同坐標系刺點時,位置相差較遠,影響工作效率。2.該軟件不支持wgs84轉國家2000,比如photoscan。所以需要把pos數據轉為跟像控點…

php system 255,GitHub - dwg255/OA-SYS: OA辦公系統開源項目

OA-SYSOA辦公系統開源項目這是一套主要用于演示、學習為目的OA辦公自動化系統。該系統具備基本的自動化辦公功能。在使用前請確保您已閱讀本系統協議部分內容。主要功能列表用戶和用戶組、權限管理個人網盤和分享文件生產計劃任務和業績考評通訊錄和內部短消息公告系統個人工作…

wpcomments post.php,WordPress移動wp-comments-post文件防垃圾評論

將wp-comments-post文件移動到主題目錄中達到阻止垃圾評論。需要修改程序文件:一、首先打開Wordpress程序根目錄的wp-comments-pos.php文件,用:require( dirname(__FILE__) . /../../../wp-load.php );替換第16行的:require( dirn…

人工蜂群算法python_改進的人工蜂群算法解決聚類問題(在Python中的分步實現)...

在之前的文章中,我介紹了如何通過實施名為Artificial Bee Colony(ABC)的群集智能(SI)算法來解決現實世界中的優化問題。現在是時候讓我們掌握一些真實的數據并解釋我們如何使用我們的ABC算法的Python實現來執行群集任務。但在此之前,讓我們深入了解一下聚…

python涉及到的邏輯_涉及邏輯運算的python表達式的運算順序

以下代碼并不報錯,而我理解在”point 1″處如果先運算小括號里面的表達式,而y并不存在,不應該報錯嗎?難道發現x 10的短路運算優先于小括號里面的表達式運算?將這一行中x 10改為x 100后報錯了,這個理解沒…

oracle sql last_value,図でイメージするOracle DatabaseのSQL全集 第3回 分析関數

指定したソートキーでの、最初の行の値を求めるのが、First_Value関數。指定したソートキーでの、最後の行の値を求めるのが、Last_Value関數。指定したソートキーでの、(Row_Numberな順位が)n番目の行の値を求めるのが、nth_Value関數となります。Oracle11gR2でnth_Value関數が…

python讀取字典元素筆記_Python 學習筆記 - 字典

Python 字典字典是一種無序的、可修改的、可索引的容器。字典使用花括號聲明,具有鍵和值。mydic {name:孫悟空,origin:猴子}print(mydic)結果:{name: 孫悟空, origin: 猴子}訪問字典mydic {name:孫悟空,origin:猴子}print(mydic[name])結果&#xff1a…

oracle =1,oracle中的 where 1=1 和where 1 !=1

11 永真&#xff0c; 1<>1 永假。1<>1 的用處&#xff1a; 用于只取結構不取數據的場合例如&#xff1a;create table table_ly_temp tablespace ly_temp asselect * from table_ly where 1<>112建成一個與table_ly 結構相同的表table_ly_temp &#xff0c;但…

企業信息化投入中咨詢服務_全過程工程咨詢服務核心價值是什么

建筑行業服務現狀傳統建設工程的目標、計劃、控制都以參與單位個體為主要對象&#xff0c;項目管理的階段性和局部性割裂了項目的內在聯系&#xff0c;導致項目管理存在明顯的管理弊端&#xff0c;這種模式已經與國際主流的建設管理模式脫軌。“專而不全”、“多小散”企業的參…

sp_addlinkedserver oracle,sp_addlinkedserver使用方法

Exec sp_droplinkedsrvlogin DBVIP,Null --刪除映射(錄與鏈接服務器上遠程登錄之間的映射)Exec sp_dropserver DBVIP --刪除遠程服務器鏈接EXEC sp_addlinkedserverserverDBVIP,--被訪問的服務器別名srvproduct,providerSQLOLEDB,datasrc"…