精盡Spring Boot原始碼分析 - 序言

月圓吖發表於2021-06-29

該系列文章是筆者在學習 Spring Boot 過程中總結下來的,裡面涉及到相關原始碼,可能對讀者不太友好,請結合我的原始碼註釋 Spring Boot 原始碼分析 GitHub 地址 進行閱讀

Spring Boot 版本:2.2.x

最好對 Spring 原始碼有一定的瞭解,可以先檢視我的 《死磕 Spring 之 IoC 篇 - 文章導讀》 系列文章

如果該篇內容對您有幫助,麻煩點選一下“推薦”,也可以關注博主,感激不盡~

序言

前面一系列的文章對 MyBatis、Spring MVC、Spring IoC、Spring AOP 和 Spring TX 的原始碼進行了比較詳細的分析,不知道各位小夥伴看了多少內容。我想,學習原始碼是一個比較枯燥乏味的過程,需要靜下心來學習,你也許會感覺學不到什麼,所以會有多少小夥伴認真看這種文章呢?不管怎樣,還是希望文章對你有幫助。? 我呢,還是本著學習與分享的目的,繼續我的知識分享,希望能夠一直堅持下去。

現如今,Spring BootSpring Cloud 在許多中大型企業中被普及,Java Configuration 成為了主流,XML 配置的方式也逐漸“消失”在我們的視野裡面。前面我們已經學完 Spring 相關的原始碼,那麼接下來一起來學習 Spring Boot 的原始碼,揭開它神祕的面紗。

如果你對 Spring 的原始碼有比較充分的瞭解,那麼閱讀 Spring Boot 的原始碼會比較輕鬆,我花了一週左右時間,應該看得差不多了? 所以對於 Spring 原始碼不熟悉的小夥伴,如果有興趣的話,可以先去看看我前面的一系列文章。

接下來 Spring Boot 系列文章主要分為以下幾個部分:

  • 除錯環境的搭建與專案結構概述
  • Spring Boot 應用打成 jar 包的啟動實現
  • Spring Boot 的 SpringApplication 啟動類的啟動過程
  • Spring Boot 內嵌 Tomcat 容器的實現
  • Spring Boot 支援外部 Tomcat 容器的實現
  • @SpringBootApplication 註解的實現原理,也就是 Spring Boot 的 @EnableAutoConfiguration 自動配置模組驅動註解的實現原理
  • Spring Boot 對於 Condition 介面的擴充套件
  • Spring Boot 的配置載入 - ConfigFileApplicationListener
  • Spring Boot 的日誌系統 - LoggingApplicationListener
  • Spring Boot 的 @ConfigurationProperties 註解的實現

接下來我們先把 Spring Boot 的除錯環境搭建好

依賴工具

  • Maven 3.6.3
  • Git
  • JDK 1.8+
  • IntelliJ IDEA 2020.1.1

筆者目前使用的是 Windows 系統,如果使用的是系統版本是 MAC OS 或者其他 IDEA 版本,可能會遇到相關問題,需自行 Google 處理。

原始碼拉取

Spring Boot 的 Git 倉庫 Fork 專案到自己的 Git 倉庫,方便我們在閱讀原始碼的過程中,可新增相應的註釋後提交程式碼。分支建議選擇 2.2.x 作為預設分支,因為這個分支使用 Maven 管理依賴包(後續新的版本都是 Gradle),大多數人還是更加熟悉 Maven,所以筆者選擇了 2.2.x 這個分支進行原始碼閱讀。

當然,也可以直接拉取我的 Spring Boot 原始碼分析 GitHub 地址 進行閱讀,根據我新增的註釋結合我的文章進行閱讀,體驗更佳。

由於 Spring Boot 專案比較大,從倉庫中拉取程式碼的時間會比較長,因為 Build 過程需要下載非常多的依賴,請耐心等待。

可能遇到的問題

  1. 在根目錄的 pom.xml 看到 ${disable.checks} 報錯,可以新增一個配置,禁用 Maven 程式碼檢查,如下:

    <properties>
        <revision>2.2.14.BUILD-SNAPSHOT</revision>
        <main.basedir>${basedir}</main.basedir>
        <!-- 禁用 Maven 程式碼檢查 -->
        <disable.checks>true</disable.checks>
    </properties>
    
  2. 對整個工程進行編譯的過程中出現 rabbit 相關包沒有許可權拉取的錯誤,可修改根目錄 pom.xmlrabbit-milestone 倉庫配置,如下:

    <repository>
        <id>rabbit-milestone</id>
        <name>Rabbit Milestone</name>
        <!-- https://dl.bintray.com/rabbitmq/maven-milestones -->
        <url>https://repos.spark-packages.org</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
    
  3. 如果編譯的過程中還出現 Cannot resolve 的錯誤,可以試著將自己的私有倉庫註釋掉,使用阿里雲的 Maven 倉庫。

專案結構概覽

整個 spring-boot 工程專案結構如下:

spring-boot
---- spring-boot-project
-------- spring-boot
-------- spring-boot-actuator
-------- spring-boot-actuator-autoconfigure
-------- spring-boot-autoconfigure
-------- spring-boot-cli
-------- spring-boot-dependencies
-------- spring-boot-devtools
-------- spring-boot-docs
-------- spring-boot-parent
-------- spring-boot-properties-migrator
-------- spring-boot-starters
-------- spring-boot-test
-------- spring-boot-test-autoconfigure
-------- spring-boot-tools
-------- pom.xml
---- spring-boot-tests
---- pom.xml

各個子模組的描述:

spring-boot-tests:專案的測試類

spring-boot-project:整個 Spring Boot 專案的實現,包含了許多個子模組,如下:

  1. spring-boot(核心):Spring Boot 的核心實現,根據包名可以知道哪些功能是在哪些包下實現的

  2. spring-boot-autoconfigure(核心):Spring Boot 自動配置的實現,也就是在 Spring 中很多需要通過 XML 配置的類在這裡會通過註解進行配置注入(如果可以的話),自動配置,簡化 Spring 應用

  3. spring-boot-starters(核心):提供許多常用元件的 Starter 模組,沒有相關 Java 程式碼,僅僅是一個 pom.xml 檔案,裡面引入元件的相關依賴,幫助我們快速引入元件並使用;通常一個 Spring Boot Starter 需要結合 autoconfigure 自動配置一起引入,這樣就能夠快速啟動

  4. spring-boot-test:提供單元測試的支援

  5. spring-boot-test-autoconfigure:提供單元測試的自動配置功能

  6. spring-boot-tools:Spring Boot 提供的工具箱

    例如其中的 spring-boot-maven-plugin 子模組可以幫助我們將自己的專案打成一個 jar 包,還有一個 spring-boot-loader 子模組是啟動 jar 包的實現,例如 java -jar x.jar(這個 jar 包是 Spring Boot 外掛生成的)啟動應用時,並不是直接呼叫我們的 main 方法,而是呼叫 spring-boot-loader 模組中的啟動方法,後面會講到~

  7. spring-boot-devtools:提供應用熱部署的支援

  8. spring-boot-actuator:提供對我們的應用健康檢查和監控的功能

  9. spring-boot-actuator-autoconfigure:提供 spring-boot-actuator 自動配置功能

  10. spring-boot-parent:無 Java 程式碼,僅一個 pom.xml 檔案,是其他子模組的 parent

    我們可以設定自己專案的 parentspring-boot-parent 來引入 Spring Boot

  11. spring-boot-dependencies:無 Java 程式碼,僅一個 pom.xml 檔案,是 spring-boot-parentparent,裡面配置了當前 Spring Boot 版本對應其他元件的版本資訊

    我們可以新增 spring-boot-dependencies 依賴來引入 Spring Boot(推薦)

程式碼統計

通過 IDEA Statistic 外掛,分別統計了一下兩個模組的程式碼量,如下:

spring-boot

精盡Spring Boot原始碼分析 - 序言

spring-boot-autoconfigure

精盡Spring Boot原始碼分析 - 序言

可以看到這兩個模組加起來的程式碼有點多,不過除去註釋什麼的也沒多少?,既然我們都看過 Spring Framework 了,這也不算什麼了?

接下來,開始我們的 Spring Boot 原始碼學習之旅?‍?

相關文章