天天看點

SpringBoot啟動流程原理

spring boot的啟動流程

一、初始化SpringAppliaction對象

SpringBoot啟動流程原理
1. 設定應用的容器類型

目前的

web應用類型

webApplicationType

)是在

SpringApplication

構造函數

中設定的,設定的邏輯在

WebApplicationType.deduceFromClasspath

中:

SpringBoot啟動流程原理
return WebApplicationType.SERVLET;
           

可以看出SpringBoot将應用程式分為三種類型:

  1. Reactive

    Spring

    團隊推出的

    Reactor

    程式設計模型的非阻塞異步Web程式設計架構WebFlux
  2. Servlet

    基于

    J2EE Servlet API

    的程式設計模型,運作在

    Servlet

    容器上
  3. None

    非Web應用程式

通過類路徑中是否存在

WebFlux

中的

Dispatcherhandler

SpringMVC

中的

DispatcherServlet

Servlet

ConfigurableWebApplicationContext

來推斷Web應用程式類型

2. 收集加載資源(比如ApplicationContextInitializer、ApplicationListener)

A. 将ApplicationContextInitializer在spring.factories檔案中對應的類全部執行個體化。

B. 将ApplicationListener在spring.factories檔案中對應的類全部執行個體化。

SpringBoot啟動流程原理
SpringBoot啟動流程原理
public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
           
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理

二 、run()方法

1. 建立并配置目前Spring Boot應用将要使用的Environment,加載application.yml檔案

通過周遊ApplicationListener所有執行個體,真正實作加載application.yml檔案的是org.springframework.boot.context.config.ConfigFileApplicationListenter

SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
2. 根據環境建立對應容器

printBanner()列印springboot旗幟

SpringBoot啟動流程原理
3. 将之前通過@EnableAutoConfiguration擷取的所有配置以及其他形式的IoC容器配置加載到已經準備完畢的ApplicationContext

啟動類中@SpringBootApplication是個組合注解,即

  1. @Configuration

    聲明目前類是一個配置類,相當于xml檔案。

  2. @ComponentScan

    自動掃描需要裝配的類,并自動裝配到Spring的Bean容器中

  3. @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容器中。

SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理
SpringBoot啟動流程原理