1. 程式人生 > >Springboot學習路徑之啟動過程

Springboot學習路徑之啟動過程

前言
Springbooot是Spring推出的微服務框架,也是最近幾年比較火的微服務框架之一,Springboot最大的特點就是沒有配置檔案,基本都是全部自動配置完成,只需要開發者掌握Spring中各種註解和基礎的web環境配置即可。從整體的結構來看,Springboot大部分都是Spring框架背後的一些概念和實踐方式,只不過是在某些特定的場景做了固話和昇華,讓我們能更高效的做開發。
一、Springboot的啟動入口
一般在生成的Springboot的專案中,都會自動生成BootApplication這樣一個類,程式碼如下:

@EnableTransactionManagement
@ServletComponentScan
@MapperScan("com.test.*.dao")
@SpringBootApplication
public class BootdoApplication extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(BootdoApplication.class, args);
}

Springboot核心入口就是:

SpringApplication.run(BootdoApplication.class, args);

二、SpringApplication的靜態run方法
那麼這個靜態的run方法是怎麼實現的呢?
先看原始碼:
在這裡插入圖片描述
在這裡我們看到了在重構run()方法中,首先建立一個SpringApplication物件例項,然後呼叫這個建立好的SpringApplication的例項方法,那麼我們再來看看在這個SpringApplication方法中都幹了什麼:
在這裡插入圖片描述
我們看到在這裡有一個initialize的初始化方法:
在這裡插入圖片描述
我們看到初始化做了以下幾件事情:
1、this.webEnvironment = deduceWebEnvironment();


在這裡插入圖片描述
根據classpath裡面是否存在某個特徵類(org.springframework.web.context.ConfigurableWebApplicationContext)來決定是否應該建立一個為Web應用使用的ApplicationContext型別。
2、使用SpringFactoriesLoader在應用的classpath中查詢並載入所有可用的ApplicationContextInitializer。
3、使用SpringFactoriesLoader在應用的classpath中查詢並載入所有可用的ApplicationListener。
4、this.mainApplicationClass = deduceMainApplicationClass();

在這裡插入圖片描述
推斷並設定main方法的定義類並設定到SpringApplication的this.mainApplicationClass完成初始化。
三、呼叫SpringApplication例項的run方法來啟動應用
完以上的準備工作以後呼叫SpringApplication例項的run方法來啟動應用,程式碼如下:
在這裡插入圖片描述
1、首先ApplicationArguments applicationArguments = new DefaultApplicationArguments( args);對傳入的args引數進行初始化,為ApplicationArguments物件SpringApplication.run(Application.class, args);取這裡傳入值;
2、然後建立並配置當前Spring Boot應用將要使用的Environment(包括配置要使用的PropertySource以及Profile)ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
3、緊接著如果SpringApplication的showBanner屬性被設定為true,則列印banner;
4、根據使用者是否明確設定了applicationContextClass型別以及初始化階段的推斷結果,決定該為當前SpringBoot應用建立什麼型別的ApplicationContext並建立完成,然後根據條件決定是否新增ShutdownHook,決定是否使用自定義的BeanNameGenerator,決定是否使用自定義的ResourceLoader,當然,最重要的,將之前準備好的Environment設定給建立好的ApplicationContext使用;
在這裡插入圖片描述
5、ApplicationContext建立好之後,SpringApplication會再次藉助Spring-FactoriesLoader,查詢並載入classpath中所有可用的ApplicationContext-Initializer,然後遍歷呼叫這些ApplicationContextInitializer的initialize(applicationContext)方法來對已經建立好的ApplicationContext進行進一步的處理。
6、遍歷呼叫所有SpringApplicationRunListener的contextPrepared()方法。
7、 最核心的一步,將之前通過@EnableAutoConfiguration獲取的所有配置以及其他形式的IoC容器配置載入到已經準備完畢的ApplicationContext。
8、 遍歷呼叫所有SpringApplicationRunListener的contextLoaded()方法。
9、 呼叫ApplicationContext的refresh()方法,完成IoC容器可用的最後一道工序。
10、 查詢當前ApplicationContext中是否註冊有CommandLineRunner,如果有,則遍歷執行它們。
11、 正常情況下,遍歷執行SpringApplicationRunListener的finished()方法(如果整個過程出現異常,則依然呼叫所有SpringApplicationRunListener的finished()方法,只不過這種情況下會將異常資訊一併傳入處理)
至此,Springboot就完成了啟動。