該系列文章是筆者在學習 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 原始碼學習之旅?????
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/288678.html
標籤:其他
上一篇:Java 讀取漢字拼音
