從SpringBoot啟動,閱讀源碼設計

目錄

  • 一、背景說明
  • 二、SpringBoot工程
  • 三、應用上下文
  • 四、資源加載
  • 五、應用環境
  • 六、Bean對象
  • 七、Tomcat服務
  • 八、事件模型
  • 九、配置加載
  • 十、數據庫集成
  • 十一、參考源碼
服務啟動堪稱Spring源碼設計的答案;
一、背景說明初學SpringBoot框架時 , 第一次啟動服務 , 直呼什么鬼?只需要簡單的幾步配置 , 幾個核心的注解,就可以快速實現工程的搭建和運行;
雖然從Spring框架遷移到SpringBoot框架 , 在初期會有很多的不適應,但是更好用的框架會快速得到認可,從而成為主流的技術選型;
對于大多數的框架或者組件來說,如果使用起來越是簡便,那么其內部的封裝策略就越是復雜;
比如在Spring框架更新到SpringBoot版本時,其用法的簡便與內部封裝的復雜性已經形成強烈的對比;再到SpringCloud微服務框架時 , 其封裝邏輯復雜到離譜;
對于服務端的開發來說 , 繞不開對Spring框架的深度學習,如果單純站在源碼閱讀的角度,建議先熟讀SpringBoot啟動流程,然后再適當擴展其他源碼塊;
二、SpringBoot工程首先聊一聊閱讀源碼的基本思路,從一個極簡的案例開始,圍繞案例中的核心API作為切入點,通過對源碼邏輯的斷點調試 , 從而體會其設計的原理;
閱讀SpringBoot的源碼,可以從服務啟動方法作為切入點,然后不斷的分析啟動過程涉及到的核心API和設計原理,再基于具體的啟動日志去分析抽象的加載邏輯;
從SpringBoot啟動,閱讀源碼設計

文章插圖
在看具體的源碼之前,還需要說下分析思路,Spring項目中,要注意每個API所屬工程與層級,然后再去分析API之間關系,核心的構造、屬性、方法等;
在SpringBoot的啟動類中,有兩個核心的切入點,一個是類的構造方法,完成一列的初始化動作;一個是啟動方法,實現應用上下文的創建和裝載;
構造方法:
從SpringBoot啟動,閱讀源碼設計

文章插圖
啟動方法:
從SpringBoot啟動,閱讀源碼設計

文章插圖
需要說明的是,由于SpringBoot服務啟動過程涉及源碼過多,所以上面的源碼中只是羅列部分的核心切入點,然后圍繞這些關鍵流程展開,分析一些常見的源碼設計;
另外說明一點 , 以下源碼的核心版本:JDK-1.8spring-5.2.4,spring-boot-2.2.5 , 在不同的版本下源碼會存在差異;
三、應用上下文服務啟動時,根據應用類型判斷創建的上下文,此處啟動的是基于servlet的web應用,所以也依賴相應的web服務器,默認為Tomcat;
啟動方法的核心在于對應用上下文的創建、準備、刷新 , 應用上下文是一個十分抽象的描述,可以理解為應用運行的整體環境,其中涉及到資源加載,配置文件裝配,運行服務的管理等,后續的源碼分析都圍繞該API展開;
從SpringBoot啟動,閱讀源碼設計

文章插圖
ApplicationContext:應用上下文核心接口,在該接口中所有的方法都是只讀模式,即只能通過Get方法進行訪問;
ConfigurableApplicationContext:上下文配置擴展接口,提供了應用上下文的配置能力,生命周期的維護,以及在關閉之后的相關資源釋放;
AbstractApplicationContext:上下文接口抽象實現,核心的API,對應用上下文中的公共能力做了實現;
ConfigurableWebApplicationContext:Web應用上下文配置擴展接口,提供了Web應用的上下文配置能力;
WebServerApplicationContext:Web服務上下文,創建并管理Web應用的服務器,在該流程中嵌入的是Tomcat服務;
根據應用上下文幾個核心的API設計,體會Spring源碼的設計思路 , 從頂級的接口開始,不斷向下擴展并且新增方法,理解抽象實現類的邏輯,以及服務運行時所依賴的具體API;
四、資源加載什么是資源,可以是各種類型的文件和配置,字節輸入流的轉換 , 也可以是URL資源定位,Spring框架在運行的過程中,需要依賴Resource接口實現對底層資源的訪問;

推薦閱讀