注:該源碼分析對應SpringBoot版本爲2.1.0.RELEASEjava
本篇接
如何搭建本身的SpringBoot源碼調試環境?--SpringBoot源碼(一)。redis
前面搭建好了本身本地的SpringBoot源碼調試環境後,此時咱們不要急着下手進入到具體的源碼調試細節中,剛開始閱讀源碼,此時咱們必定要對項目結構等有一個總體的認識,而後再進行源碼分析調試。推薦閱讀下筆者以前寫的的分析開源項目源碼,咱們該如何入手分析?一文,乾貨滿滿哦。spring
咱們先來對SpringBoot的源碼模塊來一個大體的瞭解,以下圖:數據庫
從上圖能夠看到,主要有如下四個模塊:框架
Samples are built via the invoker plugin
,該模塊無代碼。由於SpringBoot的所有功能在spring-boot-project模塊實現,所以下面重點來介紹下 spring-boot-project 模塊。maven
先來看下spring-boot-project總體模塊結構,以下圖,而後咱們再逐個來介紹:ide
這個模塊沒有代碼,是spring-boot模塊的父項目,被其餘子模塊繼承。spring-boot
這個模塊是SpringBoot項目的核心,能夠說一些基礎核心的功能都在這裏實現,爲SpringBoot的其餘模塊組件功能提供了支持,主要包括如下核心功能:工具
SpringApplication
類,這個是SpringBoot的啓動類,提供了一個靜態的run
方法來啓動程序,該類主要用來建立而且刷新Spring容器ApplicationContext
.java -jar xxx.jar
命令時能夠帶一些參數,好比執行java -jar demo.jar --server.port=8888
來將應用端口修改成8888.ApplicationContext
initializers),來執行一些SpringBoot啓動時的初始化邏輯。這個模塊跟SpringBoot的自動配置有關,也是SpringBoot的新特性之一。好比SpringBoot能基於類路徑來自動配置某個項目模塊,自動配置最爲關鍵的註解是@EnableAutoConfiguration
,這個註解能觸發Spring上下文的自動配置。另一個重要的註解是@Conditional
。源碼分析
舉個栗子,若
HSQLDB
在項目的類路徑中,且咱們沒有配置任何其餘數據庫的鏈接,此時自動配置就會自動根據類路徑來建立相應的bean
。
除了根據類路徑來進行自動配置外,還有根據容器中是否存在某個bean等方式來進行自動配置,這裏不會進入到具體細節中。
這個模塊是跟SpringBoot的起步依賴有關,也是SpringBoot的新特性之一。SpringBoot經過提供衆多起步依賴下降項目依賴的複雜度。起步依賴其實就是利用maven項目模型將其餘相關的依賴給聚合起來,裏面各類依賴的版本號都給定義好,避免用戶在引入依賴時出現各類版本衝突,方便了咱們的使用。
舉個栗子,咱們要用到activemq時,此時能夠直接引入
spring-boot-starter-activemq
起步依賴便可,若SpringBoot官網或第三方組織沒有提供相應的SpringBoot起步依賴時,此時咱們能夠進行定製本身的起步依賴。
注意,該模塊沒有代碼,主要是經過maven的pom.xml來組織各類依賴。
Spring Boot CLI是一個命令行工具,若是您想使用Spring快速開發,可使用它。它容許您運行Groovy腳本,這意味着您有一個熟悉的相似Java的語法,而沒有那麼多樣板代碼。您還能夠引導一個新項目或編寫本身的命令。
這個跟SpringBoot的監控有關,也是SpringBoot的新特性之一。能夠經過HTTP端點或JMX等來管理和監控應用。審計、運行情況和度量收集能夠自動應用到應用程序。這個監控模塊是開箱即用的,提供了一系列端點包括HealthEndpoint
, EnvironmentEndpoint
和BeansEndpoint
等端點。
這個模塊爲監控模塊提供自動配置的功能,一般也是根據類路徑來進行配置。好比Micrometer
存在於類路徑中,那麼將會自動配置MetricsEndpoint
。
這個模式是spring-boot的跟測試有關的模塊,包含了一些幫助咱們測試的核心類和註解(好比@SpringBootTest
)。
這個模塊也沒有代碼,主要是定義了一些SpringBoot的maven相關的一些依賴及其版本。
這個模塊跟SpringBoot的熱部署有關,即修改代碼後無需重啓應用即生效。
這個模塊應該是跟文檔相關的模塊。
看到 migrator 這個單詞,估計就是跟項目遷移有關,沒有去細
究。
這個模塊一看就是跟SpringBoot的測試的自動配置有關。
這個模塊一看就是SpringBoot的工具相關的模塊,提供了加載,maven插件,metadata和後置處理相關的支持。
上面介紹了這麼多spring-boot模塊下的子模塊,不用慌,咱們要進行解讀的模塊很少,咱們真正要看的模塊有spring-boot
,spring-boot-autoconfigure
,spring-boot-starters
和spring-boot-actuator
模塊。
前面弄清楚了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無非是作了一些版本管理,聚合模塊之間的事情。
好了,前面已經把SpringBoot源碼項目的各個模塊的功能和模塊pom之間的關係給捋清楚了,總之剛開始分析項目源碼,有一個總體的大局觀很重要。
原本下節想先寫SpringBoot的啓動流程分析的,但因爲以前研究過啓動流程,因此就把啓動流程分析放後點寫了。下一節先對SpringBoot的新特性--自動配置的源碼擼起來,所以下一節讓咱們先來揭開SpringBoot自動配置背後神祕的面紗吧,嘿嘿