springboot運行流程,主要集中在
springApplication.class
這個類中,我們可以通過springboot啟動類調(diào)用的springApplication.run()方法為起點,粗略的閱讀源碼,下文為流程粗略紀要,讀者可以根據(jù)紀要閱讀一遍。
一、new SpringApplication,執(zhí)行initialize()方法
1)、判斷是否是web環(huán)境
2)、加載所有classpath目錄下META-INF/spring.factories配置文件中的ApplicationContextInitializer
3)、加載所有classpath目錄下META-INF/spring.factories配置文件中的ApplicationListener
4)、推斷main方法所在的類
二、執(zhí)行run方法
1)設置java.awt.headless系統(tǒng)變量
2)加載所有classpath目錄下META-INF/spring.factories配置文件中的SpringApplicationRunListener
3)執(zhí)行所有SpringApplicationRunListener的started方法
4)實例化ApplicationArguments對象
5)創(chuàng)建environment
6)配置environment,主要是把run方法配置到environment
7)執(zhí)行所有SpringApplicationRunListener的environmentPrepared方法
8)如果不是webEnvironment,且有必要,則把當前Environment轉(zhuǎn)換為標準的Environment
9)初始化ApplicationContext,如果是web Environment,則實例化org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext
否則實例化org.springframework.context.annotation.AnnotationConfigApplicationContext
10)如果beanNameGenerator不為空,就把beanNameGenerator對象注入到context中
11)回調(diào)所有的ApplicationContextInitializer
12)執(zhí)行所有SpringApplicationRunListener的contextPrepared方法
13)依次往spring容器中注入ApplicationArguments、Banner
14)加載所有的源到context中(源即為springboot項目的啟動類)
15)執(zhí)行所有SpringApplicationRunListeners的contextLoaded方法
16)執(zhí)行applicationContext的refresh方法,并且調(diào)用ApplicationContext.registerShutdownHook()方法
17)回調(diào),獲取容器中所有的ApplicationRunner、CommandLineRunner對象,然后排序、依次調(diào)用
18)執(zhí)行SpringApplicationRunListeners.finished方法,結束所有的監(jiān)聽
19)結束啟動計時,如果啟動狀態(tài)異常,打印日志
建議讀者先閱讀我的前幾篇Spring-boot事件監(jiān)聽和源碼分析、spring-boot ApplicationContextInitializer實現(xiàn)與使用、spring-boot CommandLineRunner、ApplicationRunner實現(xiàn)與使用文章,閱讀后就能理解他們執(zhí)行的先后順序啦~