注:該源碼分析對應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的其他模塊組件功能提供了支持,主要包括以下核心功能:
SpringApplication類,這個是SpringBoot的啟動類,提供了一個靜態的run方法來啟動程序,該類主要用來創建並且刷新Spring容器ApplicationContext.- 支持選擇不同的容器比如Tomcat,Jetty等來作為應用的嵌入容器,這個是SpringBoot的新特性之一。
- 外部配置支持,這個指的是我們執行
java -jar xxx.jar命令時可以帶一些參數,比如執行java -jar demo.jar --server.port=8888來將應用端口修改為8888. - 該模塊內置了一些SpringBoot啟動時的生命周期事件和一些容器初始化器(
ApplicationContextinitializers),來執行一些SpringBoot啟動時的初始化邏輯。
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關系,如下圖:

根據上圖可得出以下結論:
spring-boot-build(pom.xml)是項目的根pom,其子pom有spring-boot-project(pom.xml)和spring-boot-dependencies(pom.xml);spring-boot-dependencies(pom.xml)主要定義了SpringBoot項目的各種依賴及其版本,其子pom有spring-boot-parent(pom.xml)和spring-boot-starter-parent(pom.xml);spring-boot-project(pom.xml)起到聚合module的作用,其子模塊並不繼承於它,而是繼承於spring-boot-parent(pom.xml);spring-boot-parent(pom.xml)是spring-boot-project(pom.xml)的子module,但繼承的父pom為spring-boot-dependencies(pom.xml),其定義了一些properties等相關的東西。其子pom為spring-boot-project(pom.xml)的子module(注意除去spring-boot-dependencies(pom.xml)),比如有spring-boot(pom.xml),spring-boot-starters(pom.xml)和spring-boot-actuator(pom.xml)等;spring-boot-starters(pom.xml)是所有具體起步依賴的父pom,其子pom有spring-boot-starter-data-jdbc(pom.xml)和spring-boot-starter-data-redis(pom.xml)等。spring-boot-starter-parent(pom.xml),是我們的所有具體SpringBoot項目的父pom,比如SpringBoot自帶的樣例的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.RELEASE
2,https://docs.spring.io/spring-boot/docs/1.5.2.RELEASE/reference/htmlsingle/#cli
歡迎關注【源碼筆記】公眾號,一起學習交流。

