不得不知的Spring Boot與Spring Cloud應用啟動流程
在繼續(xù)分析Spring Cloud實現(xiàn)動態(tài)配置的源碼之前,我們需要補充一些Spring Boot和Spring Cloud的基礎知識才能繼續(xù)往下看。本篇我們一起學習Spring Boot與Spring Cloud應用的啟動流程。
SpringBoot應用啟動流程
當我們在Spring Boot項目中調用SpringApplication的run方法啟動應用時,Spring Boot應用啟動流程粗粒度可劃分為三個步驟。
第一步:準備環(huán)境Environment。此時會發(fā)送一個ApplicationEnvironmentPreparedEvent事件(應用環(huán)境準備事件),事件是同步消費的。當事件監(jiān)聽器都被調用完后,Spring Boot繼續(xù)完成環(huán)境Environment的準備工作,加載application.yaml以及所有的ActiveProfiles對應的application-[activeProfile].yaml配置文件。
第二步:準備ApplicationContext容器。我們在spring.factories文件中配置的EnableAutoConfiguration就是在此時被讀取的,并且根據配置的類名加載類,為類生成BeanDefinition注冊到bean工廠中。
第三步:一切準備就緒后再刷新ApplicationContext。
Spring Boot啟動流程如下圖所示。
Spring Cloud應用啟動流程
Spring Cloud項目可以在spring.factories配置文件中配置一種BootstrapConfiguration類,這與Spring Boot提供的EnableAutoConfiguration類并沒有什么區(qū)別,只是它們作用在不同的ApplicationContext容器中。
當項目中添加Spring Cloud的依賴時,SpringApplication的run方法啟動的就會是兩個容器,即兩個ApplicationContext。原本的應用啟動流程也有所變化。
Spring Cloud的BootstrapApplicationListener監(jiān)聽ApplicationEnvironmentPreparedEvent事件,在監(jiān)聽到事件時開啟一個新的ApplicationContext容器,我們可以稱這個ApplicationContext容器為Spring Cloud的Bootstrap容器。
Bootstrap容器被用來注冊spring.factories配置文件中配置的所有BootstrapConfiguration,并在Bootstrap容器初始化完成后將其Bean工廠作為原本Spring Boot啟動的ApplicationContext容器的Bean工廠的父工廠,如下圖所示。
這個Spring Cloud層的Bootstrap容器似乎是Spring Cloud特定為實現(xiàn)動態(tài)配置量身定做的。
Spring Cloud的啟動流程如下圖所示。
Spring Cloud創(chuàng)建為應用啟動一個Bootstrap容器也會走一遍Spring Boot應用的啟動流程。而原來main方法中調用SpringApplication的run方法啟動ApplicationContext容器則會卡在環(huán)境準備階段,等待Spring Cloud為其提供父工廠。
bootstrap.[yaml|props]配置文件在BootstrapApplicationListener監(jiān)聽到ApplicationEnvironmentPreparedEvent事件時,準備啟動Bootstrap容器之前讀取,并寫入到Bootstrap容器的Environment。
BootstrapApplicationListener通過判斷Environment中是否存在bootstrap這個PropertySource辨別當前容器是否是Bootstrap容器,以解決無限監(jiān)聽到ApplicationEnvironmentPreparedEvent事件啟動新容器的問題。
本文轉載自微信公眾號「 Java藝術」,可以通過以下二維碼關注。轉載本文請聯(lián)系Java藝術公眾號。