天天看點

如何分析SpringBoot源碼子產品及結構?--SpringBoot源碼(二)

注:該源碼分析對應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啟動時的生命周期事件和一些容器初始化器(

    ApplicationContext

    initializers),來執行一些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

歡迎關注【源碼筆記】公衆号,一起學習交流。