時至今日,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
依賴,來簡化項目搭建以及開發過程。
結語
總結篇就到這里結束,最后,江湖路遠,我們,下個系列見。