1.創建SpringApplication實例
1) 在SpringApplicaiton構造器中調用initialize(sources)方法。initialize方法中,將sources轉換成list加到this.sources屬性中。
2) 判斷是否為web環境,在類路徑下是否可以加載到Servlet和ConfigurableWebApplicationContext
3) 設置初始化器,從META-INF/spring.factories處讀取配置文件中Key為:org.springframework.context.ApplicationContextInitializer的value,進行實例化操作
4) 設置監聽器,StopWatch主要是監控啟動過程,統計啟動時間,檢測應用是否已經啟動或者停止。
5) 推斷應用入口類,通過尋找main方法找到啟動主類。
2.執行SpringApplication.run()
1) 獲取SpringApplicationRunListeners,(也是通過META-INF/spring.factories),默認加載的是EventPublishingRunListener。啟動監聽,調用RunListener.starting()方法。
2) 根據SpringApplicationRunListeners以及參數來准備環境,獲取環境變量environment,將應用參數放入到環境變量持有對象中,監聽器監聽環境變量對象的變化(listener.environmentPrepared),打印Banner信息(SpringBootBanner)
3) 創建ApplicationContext(spring上下文AnnotationConfigEmbeddedWebApplicationContext)
4) 創建FailureAnalyzer, 用於觸發從spring.factories加載的FailureAnalyzer和FailureAnalysisReporter實例
5) spring上下文前置處理prepareContext
6) spring上下文刷新refreshContext
7) spring上下文后置處理afterRefresh(ApplicationRunner,CommandLineRunner接口實現類的啟動),返回上下文對象