-
SpringApplication.run(XXXApplication.class, args);
-
创建SpringApplication对象,并调用实例的run方法
-
初始化的时候,会做四件事:
1.判断是否为Web应用,并使用webEnvironment标记是否为Web应用
2.使用SpringFactoriesLoader在classpath中的spring.factories文件查找并加载所有可用的ApplicationContextInitializer
3.使用SpringFactoriesLoader在classpath中的spring.factories文件查找并加载所有可用的ApplicationListener
4.推断并设置main方法的定义类
-
run方法是SpringBoot执行流程的主要方法,它完成了如下工作:
1.查找并加载spring.factories中配置的SpringApplicationRunListener,调用它们的started方法
2.创建并配置当前SpringBoot应用要使用的Environment(包括配置要使用的PropertySource以及Profile),然后遍历调用所有SpringApplicationRunListener的environmentPrepared方法
3.打印banner,基于Banner.Mode的,可以用setBannerMode方法控制
4.根据用户是否明确设置了applicationContextClass类型以及初始化阶段第1步的推断结果,决定为当前SpringBoot应用创建什么类型的ApplicationContext
5.创建故障分析器,故障分析器可以给用户提供错误和诊断信息
6.对ApplicationContext进行后置处理;对所有可用的ApplicationContextInitializer调用initialize方法,进行进一步处理;遍历调用所有SpringApplicationRunListener的contextPrepared方法;将之前通过@EnableAutoConfiguration获取的所有配置以及其他形式的IoC容器配置加载到已经准备完毕的ApplicationContext;遍历调用所有SpringApplicationRunListener的contextLoaded方法
7.调用ApplicationContext的refresh方法,完成IoC容器可用的最后一道工序
8.查找当前ApplicationContext中是否注册有ApplicationRunner和CommandLineRunner,如果有,则遍历执行它们
9.正常情况下,遍历调用所有SpringApplicationRunListener的finished方法;如果出现异常,也会调用该方法,只不过这种情况下会将异常信息一并传入处理,具体可以参考catch块中的代码
-
catch块中的代码