該系列文章是筆者在學習 Spring Boot 過程中總結下來的,裡面涉及到相關原始碼,可能對讀者不太友好,請結合我的原始碼註釋 Spring Boot 原始碼分析 GitHub 地址 進行閱讀
Spring Boot 版本:2.2.x
最好對 Spring 原始碼有一定的瞭解,可以先檢視我的 《死磕 Spring 之 IoC 篇 - 文章導讀》 系列文章
如果該篇內容對您有幫助,麻煩點選一下“推薦”,也可以關注博主,感激不盡~
序言
前面一系列的文章對 MyBatis、Spring MVC、Spring IoC、Spring AOP 和 Spring TX 的原始碼進行了比較詳細的分析,不知道各位小夥伴看了多少內容。我想,學習原始碼是一個比較枯燥乏味的過程,需要靜下心來學習,你也許會感覺學不到什麼,所以會有多少小夥伴認真看這種文章呢?不管怎樣,還是希望文章對你有幫助。? 我呢,還是本著學習與分享的目的,繼續我的知識分享,希望能夠一直堅持下去。
現如今,Spring Boot
和 Spring 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 過程需要下載非常多的依賴,請耐心等待。
可能遇到的問題
-
在根目錄的
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>
-
對整個工程進行編譯的過程中出現 rabbit 相關包沒有許可權拉取的錯誤,可修改根目錄
pom.xml
的rabbit-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>
-
如果編譯的過程中還出現
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 專案的實現,包含了許多個子模組,如下:
-
spring-boot
(核心):Spring Boot 的核心實現,根據包名可以知道哪些功能是在哪些包下實現的 -
spring-boot-autoconfigure
(核心):Spring Boot 自動配置的實現,也就是在 Spring 中很多需要通過 XML 配置的類在這裡會通過註解進行配置注入(如果可以的話),自動配置,簡化 Spring 應用 -
spring-boot-starters
(核心):提供許多常用元件的 Starter 模組,沒有相關 Java 程式碼,僅僅是一個pom.xml
檔案,裡面引入元件的相關依賴,幫助我們快速引入元件並使用;通常一個 Spring Boot Starter 需要結合 autoconfigure 自動配置一起引入,這樣就能夠快速啟動 -
spring-boot-test
:提供單元測試的支援 -
spring-boot-test-autoconfigure
:提供單元測試的自動配置功能 -
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
模組中的啟動方法,後面會講到~ -
spring-boot-devtools
:提供應用熱部署的支援 -
spring-boot-actuator
:提供對我們的應用健康檢查和監控的功能 -
spring-boot-actuator-autoconfigure
:提供spring-boot-actuator
自動配置功能 -
spring-boot-parent
:無 Java 程式碼,僅一個pom.xml
檔案,是其他子模組的parent
我們可以設定自己專案的
parent
為spring-boot-parent
來引入 Spring Boot -
spring-boot-dependencies
:無 Java 程式碼,僅一個pom.xml
檔案,是spring-boot-parent
的parent
,裡面配置了當前 Spring Boot 版本對應其他元件的版本資訊我們可以新增
spring-boot-dependencies
依賴來引入 Spring Boot(推薦)
程式碼統計
通過 IDEA Statistic 外掛,分別統計了一下兩個模組的程式碼量,如下:
spring-boot
:
spring-boot-autoconfigure
:
可以看到這兩個模組加起來的程式碼有點多,不過除去註釋什麼的也沒多少?,既然我們都看過 Spring Framework 了,這也不算什麼了?
接下來,開始我們的 Spring Boot 原始碼學習之旅??