1. SpringApplication.run(XXXApplication.class, args);
    1. 创建SpringApplication对象,并调用实例的run方法
      1. 初始化的时候,会做四件事: 1.判断是否为Web应用,并使用webEnvironment标记是否为Web应用 2.使用SpringFactoriesLoader在classpath中的spring.factories文件查找并加载所有可用的ApplicationContextInitializer 3.使用SpringFactoriesLoader在classpath中的spring.factories文件查找并加载所有可用的ApplicationListener 4.推断并设置main方法的定义类
      2. 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块中的代码
        1. catch块中的代码