-
1、實(shí)例化/初始化 springAppliction 構(gòu)造函數(shù)處理了幾個(gè)事
- 持有啟動(dòng)方法傳遞的class對(duì)象
- 是否是web類(lèi)型,還是都不是
- 初始化spring.factories配置的 ApplicationContextInitializer對(duì)象①
- 初始化spring.factories配置的 ApplicationListener對(duì)象②
- 從調(diào)用棧里查找main方法的類(lèi)對(duì)象.
-
2、運(yùn)行
- 配置awt headless模式,聲明沒(méi)有圖像設(shè)備等.
- 初始化spring.factories和輸入?yún)?shù)指定的 SpringApplicationRunListener對(duì)象, 并啟動(dòng)監(jiān)聽(tīng).
- 觸發(fā)所有的SpringApplicationRunListener的starting方法->發(fā)出ApplicationStartingEvent事件③
- 初始化環(huán)境environment
- 根據(jù)環(huán)境創(chuàng)建environment
- 觸發(fā)所有的SpringApplicationRunListener的environmentPrepared方法->發(fā)出ApplicationEnvironmentPreparedEvent事件③
- 實(shí)例化/初始化ApplictionContext, 會(huì)判斷是否是web環(huán)境, 創(chuàng)建對(duì)應(yīng)的applictionContext
- 初始化spring.factories配置的 SpringBootExceptionReporter對(duì)象, 該對(duì)象會(huì)同時(shí)加載spring.factories配置的FailureAnalyzer類(lèi)對(duì)象。SpringBootExceptionReporter用于程序啟動(dòng)時(shí)異常捕獲,并輸出成易于查看的格式.
- 準(zhǔn)備ApplictionContext
- 觸發(fā)所有ApplicationContextInitializer對(duì)象的initialize方法
- 觸發(fā)SpringApplicationRunListener的監(jiān)聽(tīng),觸發(fā)contextPrepared方法 ->發(fā)出ApplicationContextInitializedEvent事件③
- 根據(jù)啟動(dòng)方法的class對(duì)象加載資源
- 觸發(fā)SpringApplicationRunListener的監(jiān)聽(tīng),觸發(fā)contextLoaded方法->發(fā)出ApplicationPreparedEvent事件③
-
刷新ApplictionContext, 委托給spring最原始的refresh方法
- 觸發(fā)SpringApplicationRunListener的監(jiān)聽(tīng),觸發(fā)started方法->發(fā)出ApplicationStartedEvent事件③
觸發(fā)ApplicationRunner, CommandLineRunner實(shí)現(xiàn)類(lèi)的run方法
觸發(fā)SpringApplicationRunListener的監(jiān)聽(tīng),觸發(fā)running方法->發(fā)出ApplicationReadyEvent事件③
方法運(yùn)行結(jié)束,程序退出
① 可以實(shí)現(xiàn)自己的ApplicationContextInitializer, 在springApplication前執(zhí)行.
② 可以監(jiān)聽(tīng)啟動(dòng)過(guò)程發(fā)生的事件, 如ConfigFileApplicationListener監(jiān)聽(tīng)ApplicationEnvironmentPreparedEvent事件,處理EnvironmentPostProcessor,可以自定義自己的配置文件加載等.
③ 可以監(jiān)聽(tīng)事件,在啟動(dòng)的不通階段插入自定義的處理.
總結(jié):
spring-boot的啟動(dòng)擴(kuò)展的ApplicationContext,在ApplicationContext初始化/刷新前后做了自定義處理。也方便開(kāi)發(fā)人員在流程中自定義插入自己的實(shí)現(xiàn).