注:該源碼分析對應SpringBoot版本為2.1.0.RELEASE
1 前言
本篇接
如何搭建自己的SpringBoot源碼調試環境?--SpringBoot源碼(一)。
前面搭建好了自己本地的SpringBoot源碼調試環境後,此時我們不要急着下手進入到具體的源碼調試細節中,剛開始閱讀源碼,此時我們一定要對項目結構等有一個整體的認識,然後再進行源碼分析調試。推薦閱讀下筆者之前寫的的
分析開源項目源碼,我們該如何入手分析?一文,幹貨滿滿哦。
2 SpringBoot源碼子產品一覽
我們先來對SpringBoot的源碼子產品來一個大緻的了解,如下圖:
從上圖可以看到,主要有以下四個子產品:
- spring-boot-project:整個SpringBoot架構全部功能在這個子產品實作,SpringBoot項目95%的代碼都在這裡實作,源碼總共有25萬行左右。
- Spring-boot-samples:這個是SpringBoot給小夥伴們贈送的福利,裡面包含了各種各樣使用SpringBoot的簡單demo,我們調試閱讀源碼的時候可以充分利用該子產品。
- Spring-boot-sample-invoker:這個子產品應該是跟sample子產品有關,注意根pom.xml中有這麼一句話:
,該子產品無代碼。Samples are built via the invoker plugin
- Spring-boot-tests:這個子產品SpringBoot的測試子產品,跟部署測試和內建測試有關。
因為SpringBoot的全部功能在spring-boot-project子產品實作,是以下面重點來介紹下 spring-boot-project 子產品。
3 spring-boot-project源碼子產品詳解
先來看下spring-boot-project整體子產品結構,如下圖,然後我們再逐個來介紹:
1) spring-boot-parent
這個子產品沒有代碼,是spring-boot子產品的父項目,被其他子子產品繼承。
2) spring-boot
這個子產品是SpringBoot項目的核心,可以說一些基礎核心的功能都在這裡實作,為SpringBoot的其他子產品元件功能提供了支援,主要包括以下核心功能:
-
類,這個是SpringBoot的啟動類,提供了一個靜态的SpringApplication
方法來啟動程式,該類主要用來建立并且重新整理Spring容器run
.ApplicationContext
- 支援選擇不同的容器比如Tomcat,Jetty等來作為應用的嵌入容器,這個是SpringBoot的新特性之一。
- 外部配置支援,這個指的是我們執行
指令時可以帶一些參數,比如執行java -jar xxx.jar
來将應用端口修改為8888.java -jar demo.jar --server.port=8888
- 該子產品内置了一些SpringBoot啟動時的生命周期事件和一些容器初始化器(
initializers),來執行一些SpringBoot啟動時的初始化邏輯。ApplicationContext
3) spring-boot-autoconfigure
這個子產品跟SpringBoot的自動配置有關,也是SpringBoot的新特性之一。比如SpringBoot能基于類路徑來自動配置某個項目子產品,自動配置最為關鍵的注解是
@EnableAutoConfiguration
,這個注解能觸發Spring上下文的自動配置。另外一個重要的注解是
@Conditional
舉個栗子,若在項目的類路徑中,且我們沒有配置任何其他資料庫的連接配接,此時自動配置就會自動根據類路徑來建立相應的
HSQLDB
bean
除了根據類路徑來進行自動配置外,還有根據容器中是否存在某個bean等方式來進行自動配置,這裡不會進入到具體細節中。
4) spring-boot-starters
這個子產品是跟SpringBoot的起步依賴有關,也是SpringBoot的新特性之一。SpringBoot通過提供衆多起步依賴降低項目依賴的複雜度。起步依賴其實就是利用maven項目模型将其他相關的依賴給聚合起來,裡面各種依賴的版本号都給定義好,避免使用者在引入依賴時出現各種版本沖突,友善了我們的使用。
舉個栗子,我們要用到activemq時,此時可以直接引入 spring-boot-starter-activemq
起步依賴即可,若SpringBoot官網或第三方組織沒有提供相應的SpringBoot起步依賴時,此時我們可以進行定制自己的起步依賴。
注意,該子產品沒有代碼,主要是通過maven的pom.xml來組織各種依賴。
5) spring-boot-cli
Spring Boot CLI是一個指令行工具,如果您想使用Spring快速開發,可以使用它。它允許您運作Groovy腳本,這意味着您有一個熟悉的類似Java的文法,而沒有那麼多樣闆代碼。您還可以引導一個新項目或編寫自己的指令。
6) spring-boot-actuator
這個跟SpringBoot的監控有關,也是SpringBoot的新特性之一。可以通過HTTP端點或JMX等來管理和監控應用。審計、運作狀況和度量收集可以自動應用到應用程式。這個監控子產品是開箱即用的,提供了一系列端點包括
HealthEndpoint
,
EnvironmentEndpoint
和
BeansEndpoint
等端點。
7) spring-boot-actuator-autoconfigure
這個子產品為監控子產品提供自動配置的功能,通常也是根據類路徑來進行配置。比如
Micrometer
存在于類路徑中,那麼将會自動配置
MetricsEndpoint
8) spring-boot-test
這個模式是spring-boot的跟測試有關的子產品,包含了一些幫助我們測試的核心類和注解(比如
@SpringBootTest
)。
9) spring-boot-dependencies
這個子產品也沒有代碼,主要是定義了一些SpringBoot的maven相關的一些依賴及其版本。
10) spring-boot-devtools
這個子產品跟SpringBoot的熱部署有關,即修改代碼後無需重新開機應用即生效。
11) spring-boot-docs
這個子產品應該是跟文檔相關的子產品。
12) spring-boot-properties-migrator
看到 migrator 這個單詞,估計就是跟項目遷移有關,沒有去細
究。
13) spring-boot-test-autoconfigure
這個子產品一看就是跟SpringBoot的測試的自動配置有關。
14) spring-boot-tools
這個子產品一看就是SpringBoot的工具相關的子產品,提供了加載,maven插件,metadata和後置處理相關的支援。
上面介紹了這麼多spring-boot子產品下的子子產品,不用慌,我們要進行解讀的子產品不多,我們真正要看的子產品有
spring-boot
,
spring-boot-autoconfigure
spring-boot-starters
spring-boot-actuator
子產品。
5 用一個思維導圖來總結下SpringBoot源碼項目的脈絡
6 SpringBoot子產品之間的pom關系詳解
前面弄清楚了SpringBoot的各個子產品的具體功能,此時我們來看下SpringBoot子產品的pom之間的關系是怎樣的,因為項目是通過maven建構的,是以還是有必要去研究下這塊關系滴。
先看SpringBoot源碼項目的pom關系,如下圖:
根據上圖可得出以下結論:
-
是項目的根pom,其子pom有spring-boot-build(pom.xml)
spring-boot-project(pom.xml)
;spring-boot-dependencies(pom.xml)
-
主要定義了SpringBoot項目的各種依賴及其版本,其子pom有spring-boot-dependencies(pom.xml)
spring-boot-parent(pom.xml)
spring-boot-starter-parent(pom.xml)
-
起到聚合module的作用,其子子產品并不繼承于它,而是繼承于spring-boot-project(pom.xml)
spring-boot-parent(pom.xml)
-
是spring-boot-parent(pom.xml)
的子module,但繼承的父pom為spring-boot-project(pom.xml)
,其定義了一些properties等相關的東西。其子pom為spring-boot-dependencies(pom.xml)
的子module(注意除去spring-boot-project(pom.xml)
),比如有spring-boot-dependencies(pom.xml)
spring-boot(pom.xml)
spring-boot-starters(pom.xml)
等;spring-boot-actuator(pom.xml)
-
是所有具體起步依賴的父pom,其子pom有spring-boot-starters(pom.xml)
spring-boot-starter-data-jdbc(pom.xml)
等。spring-boot-starter-data-redis(pom.xml)
-
,是我們的所有具體SpringBoot項目的父pom,比如SpringBoot自帶的樣例的spring-boot-starter-parent(pom.xml)
是繼承于它的。spring-boot-samples(pom.xml)
SpringBoot的各子產品之間的pom關系有點複雜,确實有點繞,如果看完上面的圖檔和解釋還是不太清楚的話,建議小夥伴們自己打開idea的項目,逐個去捋一下。總之記得SpringBoot的一些父pom無非是做了一些版本管理,聚合子產品之間的事情。
5 小結
好了,前面已經把SpringBoot源碼項目的各個子產品的功能和子產品pom之間的關系給捋清楚了,總之剛開始分析項目源碼,有一個整體的大局觀很重要。
本來下節想先寫SpringBoot的啟動流程分析的,但由于之前研究過啟動流程,是以就把啟動流程分析放後點寫了。下一節先對SpringBoot的新特性--自動配置的源碼撸起來,是以下一節讓我們先來揭開SpringBoot自動配置背後神秘的面紗吧,嘿嘿🤭。
下節預告:
SpringBoot自動配置的相關原理搞起來
原創不易,幫忙點個贊呗!
參考:
1,
https://github.com/spring-projects/spring-boot/tree/v2.1.0.RELEASE2,
https://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/reference/htmlsingle/#cli歡迎關注【源碼筆記】公衆号,一起學習交流。