時至今日,SpringBoot 系列文章也算是告一段落,回想起當初立flag的情景,仿佛還歷歷在目。用一個月時間學完 SpringBoot 並整理成文章?又定一些異想天開計划,當時這樣想着。不過,雖然過程比較艱辛,但結局也還算完美,在最后一篇文章完成那一刻,心情卻很平靜,我想,大概是習以為常了吧。
在系列結尾,再對 SpringBoot 做一個總結,也算是塵埃落定了。
正文
SpringBoot 最顯著的功能就是快速啟動一個 Spring 應用,為 Spring 所有特性提供了更廣泛的支持;提供一系列大型項目通用的非功能性功能(例如嵌入式服務器,安全性,指標,運行狀況檢查和外部化配置);完全沒有代碼生成,也不需要XML配置也是一大亮點。
該系列文章雖然以討論 SpringBoot 為中心,但也涉及到了 Spring 技術棧,因為 SpringBoot 底層核心是就是 Spring ,如果對 Spring 了如指掌,那學習 SpringBoot 就輕而易舉了。
1、自動裝配基礎
SpringBoot 中運用了大量的 Spring 注解,其注解大致分為這幾類:
- 配置注解:@Configuration、@ComponentScan、@Import、@Conditional、Bean
- 模式注解:@Componnt、@Repository、@Service、@Controller
- @Enable 模塊注解:@EnableWebMvc、@EnableTransactionManagement、@EnableWebFlux
配置注解都在 Spring 的 ConfigurationClassParser#doProcessConfigurationClass 方法中進行處理,后續會在 Spring 系列文章中詳細介紹;模式注解都標注了 @Component 注解,屬於 @Component 的派生注解,@ComponentScan 會掃描標注 @Component 及其派生注解的類,並將這些類加入到 Spring 容器中;@Enable 模塊注解中通過 @Import 導入配置類,在這些配置類中加載 @Enable 模塊需要的組件。
2、自動裝配正文
在 SpringBoot 時代,通過一個main方法就可以啟動一個應用,其底層依賴的就是 Spring 幾個注解。從 @SpringBootApplication 注解中的 @EnableAutoConfiguration 注解開始,@EnableAutoConfiguration 屬於 Spring 的 @Enable 模塊注解,在該注解中通過 @Import 導入 AutoConfigurationImportSelector 類,在該類中加載所有以 AutoConfiguration 為后綴且標注 @Configuration 注解的自動配置類,每個自動配置類可以裝配一個外部模塊,如 Web MVC 模塊對應的配置類是 WebMvcAutoConfiguration 。在自動配置類中又有眾多 @Conditional 條件注解,可達到靈活裝配的目的。
3、SpringApplication啟動類准備階段
詳見《SpringBoot(三)SpringApplication啟動類准備階段》
在構造 SpringApplication 啟動類時,初始化了幾個重要的類,如 WebApplicationType 、ApplicationContextInitializer、ApplicationListener。其中 WebApplicationType 存儲的是當前應用類型,如 Servlet Web 、Reactive Web; ApplicationContextInitializer 和 ApplicationListener 則是 SpringBoot 通過擴展 Spring 特性創建的初始化器及監聽器。
4、SpringApplication啟動類運行階段
詳見《SpringBoot(四)SpringApplication啟動類運行階段》
在 SpringApplication 運行階段中,先是通過擴展 Spring 監聽機制,在 SpringBoot 各個階段發布不同事件,執行多個事件監聽器;然后創建 Environment 類,這是外部化配置的核心類;最后啟動 Spring 容器,通過 WebApplicationType 判定當前應用類型,創建應用對應 ApplicationContext 應用上下文,再調用 ApplicationContext#refresh 方法啟動容器。
5、外部化配置之Environment
詳見《SpringBoot(五)外部化配置之Environment》
這篇文章介紹了外部化配置的幾種資源類型,如 properties、YAML、環境變量、系統屬性、啟動參數等。還詳細介紹了 Environment 類,該類是外部化配置核心類,所有外部化配置數據,都保存在該類中,並和大家討論了整個存儲流程。
6、外部化配置之@ConfigurationProperties
詳見《SpringBoot(六)外部化配置之@ConfigurationProperties》
@ConfigurationProperties 是 SpringBoot 實現外部化配置的重要注解,配合 SprinBoot 自動裝配特性來達到快速開發的目的。主要將 properties 配置文件和 Properties 配置類中的屬性進行映射,同樣也和大家討論了整個映射流程。
7、嵌入式Web容器
這篇文章詳細討論了容器的創建及啟動。傳統 Spring 應用需手動創建和啟動 Web 容器,在 SpringBoot 中,則是嵌入式的方式自動創建和啟動。SpringBoot 支持的 Web 容器類型有 Servlet Web 容器和 Reactive Web 容器,它們都有具體容器實現,Sevlet Web 對應的是 Tomcat、Jetty、Undertow,默認實現是 Tomcat;Reactive Web 對應的是 Netty 。
8、Starter機制之自定義Starter
詳見《SpringBoot(八)Starter機制之自定義Starter》
這篇文章詳細介紹了 SpringBoot 的 Starter 機制,並通過自定義 Starter 來深入理解整個運行機制。Starter 也是 SpringBoot 重要特性,通過集成 Starter 依賴,來簡化項目搭建以及開發過程。
結語
總結篇就到這里結束,最后,江湖路遠,我們,下個系列見。
