SprignbootApplication执行流程

执行流程

1.如果我们使用的是SpringApplication的静态run方法,那么这个方法里面首先会创建一个Application的对象实例,然后调用这个创建好的SpringApplication的实例run方法。在SpringApplication实例化的时候它会做几个事情

1.1根据calsspath里面是否存在某个特种类来判断是否创建一个Web应用使用的ApplicationContext类型还是一个非Web应用使用的ApplicationContext

1.2使用SpringFactoriesLoader在应用的classpath中查找并加载所有可用的ApplicationContextInitializer

1.3使用SpringFactoriesLoader在应用的classpath众筹安徽找并加载所有可用的ApplicationListener

1.4推断并设置main方法的定义类

@SpringBootApplication
public class Demo1Application {
    public static void main(String[] args) {
        SpringApplication.run(Demo1Application.class, args);
    }
}

2.SpringApplication实例初始化完成并完成设置后就开始执行run的方法,方法执行开始,首先遍历执行所有通过SpringFactoryesLoader可以查找到并加载的SpringApplicationRunlistener调用它们的started方法,告诉SpringApplicationRunListener Springboot应用要开始执行了

3.创建Springboot应用将要使用的Enviroment(包括配置要使用的PropertySource和profile)

4.遍历调用所有的SpringApplicationRunlistenerenviromentPrepared方法,

5.打印banner

6.根据用户是否明确设置了applicationContextClass类型以及初始化阶段的判断,决定为Springboot应用创建什么类型的ApplicationContext并创建完毕,然后根据条件是否添加S糊涂down Hook,决定是否使用自定义的BeanNameGenerator,决定是否使用自定义的ResourceLoader,将之前准备好的Environment设置给创建好的ApplicationContext使用

7.ApplicationContext创建好之后,SpringApplication会再次借助Spring-FactoriesLoader,查找并加载classpath中的所有可用的ApplicationContext-initializer,然后白能力调用这些ApplicationContextInitializer的initialize方法来对已经创建好的Application进行进一步的处理

8.遍历调用所有SpringApplicationRunlistener的contextPrepared方法,

9.最核心的一部,将之前通过的@EnableAutoCOnfiguration获取的所有配置以及其它形式的IOC容器配置加载到现已经准备完毕的ApplicationCOntext。

10遍历调用所有的SpringApplicationRunlistener的contextLoader方法,告诉所有的SpringApplicationRunlistener,ApplicationContext装填完毕

11调用ApplicationContext的refreash方法完成IOC容器可用的最后一道工序,

12查询ApplicationCOntext中是否有注册CommandLinRunner,如果有就遍历他们执行他们

13正常情况下,遍历执行SpringApplicationRunListener的finished方法(如果不是正常的情况下就调用所有的SpringApplicationRunlistener的finished方法)

至此我们完成了一个Springboot的应用的启动,整个过程看起来是无比的长,因为很多都是时间通知的扩展点,如果我们这些这些逻辑暂时忽略,那么我们的执行过程就可以精简到几步

—> 收集各种条件和回调接口,例如ApplicationContextIntializerApplicationListener

—> 通知started()

—>准备environment

—>通知environmentPrepared();

—>创建并初始化ApplicationContext,例如设置一些Environment,加载配置等…

—>通知contextPrepared()

—>通知contextLoader()

—>执行refresh完成IOC让其可用的最后一个工序

—>执行CommanadLinerunner

—>通知finished()

SpringApplicationRunListner

SpringApplicationRunListener是一个只有Springboot应用的main方法执行过程中接受不同执行时点时间通知的监听者

CommadLineRuner

是SpringBoot应用特定的回调扩展接口

ApplicationContextInitializer

实现一个ApplicationContextInitializer只需要实现它的方法就可以了,这么做会通过SpringFactoriesLoader进行配置,或者通过SpringApplication.addInitializers(…)设置即可