spring boot的啟動流程
一、初始化SpringAppliaction對象
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9cmT5lEROpXQq5EM4wmYwhGWhxGZzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcuQzM5ETNzADM0AzMwAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1. 設定應用的容器類型
目前的
web應用類型
(
webApplicationType
)是在
SpringApplication
的
構造函數
中設定的,設定的邏輯在
WebApplicationType.deduceFromClasspath
中:
return WebApplicationType.SERVLET;
可以看出SpringBoot将應用程式分為三種類型:
-
Reactive
團隊推出的Spring
程式設計模型的非阻塞異步Web程式設計架構WebFluxReactor
-
基于Servlet
的程式設計模型,運作在J2EE Servlet API
容器上Servlet
-
非Web應用程式None
通過類路徑中是否存在
WebFlux
中的
Dispatcherhandler
,
SpringMVC
中的
DispatcherServlet
、
Servlet
、
ConfigurableWebApplicationContext
來推斷Web應用程式類型
2. 收集加載資源(比如ApplicationContextInitializer、ApplicationListener)
A. 将ApplicationContextInitializer在spring.factories檔案中對應的類全部執行個體化。
B. 将ApplicationListener在spring.factories檔案中對應的類全部執行個體化。
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
二 、run()方法
1. 建立并配置目前Spring Boot應用将要使用的Environment,加載application.yml檔案
通過周遊ApplicationListener所有執行個體,真正實作加載application.yml檔案的是org.springframework.boot.context.config.ConfigFileApplicationListenter
2. 根據環境建立對應容器
printBanner()列印springboot旗幟
3. 将之前通過@EnableAutoConfiguration擷取的所有配置以及其他形式的IoC容器配置加載到已經準備完畢的ApplicationContext
啟動類中@SpringBootApplication是個組合注解,即
-
@Configuration
聲明目前類是一個配置類,相當于xml檔案。
-
@ComponentScan
自動掃描需要裝配的類,并自動裝配到Spring的Bean容器中
- @EnableAutoFiguration
在EnableAutoConfiguration中定義了兩個屬性
a. exclude和excludeName,用來排除一個自動配置的類
b. 最關鍵的是@import(EnableAutoConfigurationImportSelector.class)
@import的作用是導入一個或多個配置類。EnableAutoCongigurationImportSelector實作了 ImpostSelector接口,這個接口中定義了 selectImport方法,這個方法是用來掃描并傳回需要導入的類的。
selectImports方法是去擷取自動配置類的,裡面最重要的一行代碼就是getCandidateConfiguration方法。
這個getCandidateConfiguration方法會傳回EnableAutoConfiguration類,是通過SpringFactoriesLoader.loadFactoryNames來實作的。
這個方法裡就會讀取classpath下所有META-INF/spring.factories檔案中的配置,然後傳回一個字元串數組。裡面就定義了很多自動配置的類,把這些資訊讀取到并傳回之後,就會把這些XxxAutoConfiguration注入到Spring容器中。