1. 執(zhí)行SpringApplication的靜態(tài)run方法會實例化了一個SpringApplication對象,調(diào)用的是該類的有參構造方法。
2. SpringApplication實例初始化完成并且完成設置后,開始執(zhí)行run方法,首先遍歷執(zhí)行所有通過SpringFactoriesLoader查找到并加載的SpringApplicationRunListener,調(diào)用它們的starting()方法。
3. 準備并配置當前Spring Boot應用程序要使用的Environment(包括PropertySource和Profiles)。
4. 遍歷執(zhí)行所有SpringApplicationRunListener的environmentPrepared()的方法。比如創(chuàng)建ApplicationContext。
5. 判斷SpringApplication的bannerMode,是CONSOLE則輸出banner到System.out,是OFF則不打印,是LOG則輸出到日志文件中。
6. 判斷是否設置applicationContextClass屬性,如果有,則實例化該class;如果沒有,則判斷是否是Web環(huán)境,如果是DEFAULT_WEB_CONTEXT_CLASS,則實例化該常量所對應的AnnotationConfigEmbeddedWebApplicationContext類,否則實例化DEFAULT_CONTEXT_CLASS所對應的AnnotationConfigApplicationContext類。
7. 將之前準備好的environment配置給當前的ApplicationContext。
8. 將beanNameGenerator、resourceLoader配置給當前的ApplicationContext。
9. 創(chuàng)建好ApplicationContext之后,SpringApplication會通過SpringFactoriesLoader查找classpath中所有可用的ApplicationContextInitializer,遍歷并加載這些ApplicationContextInitializer的initialize(context)方法來對當前的ApplicationContext做進一步的處理。
10. 遍歷執(zhí)行所有SpringApplicationRunListener的contextPrepared()方法。
11. 為BeanDefinitionLoader配置beanNameGenerator、resourceLoader、environment,并加載之前通過@EnableAutoConfiguration獲取的所有配置,以及其余IoC容器配置到當前已準備完畢的ApplicationContext。
12. 遍歷執(zhí)行所有SpringApplicationRunListener的contextLoaded()方法。
13. 調(diào)用ApplicationContext的refresh()方法,完成IoC容器可用的最后工序,并為Runtime.getRuntime()添加ShutdownHook以便在JVM停止時優(yōu)雅退出。
14. 查找當前ApplicationContext中是否注冊ApplicationRunner或CommandLineRunner,如果是,則遍歷執(zhí)行它們。
15. 正常情況下,遍歷執(zhí)行SpringApplicationRunListener的finished()方法。