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.遍历调用所有的SpringApplicationRunlistener的enviromentPrepared方法,
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的应用的启动,整个过程看起来是无比的长,因为很多都是时间通知的扩展点,如果我们这些这些逻辑暂时忽略,那么我们的执行过程就可以精简到几步
—> 收集各种条件和回调接口,例如ApplicationContextIntializer,ApplicationListener
—> 通知started()
—>准备environment
—>通知environmentPrepared();
—>创建并初始化ApplicationContext,例如设置一些Environment,加载配置等…
—>通知contextPrepared()
—>通知contextLoader()
—>执行refresh完成IOC让其可用的最后一个工序
—>执行CommanadLinerunner
—>通知finished()
SpringApplicationRunListner
SpringApplicationRunListener是一个只有Springboot应用的main方法执行过程中接受不同执行时点时间通知的监听者
CommadLineRuner
是SpringBoot应用特定的回调扩展接口
ApplicationContextInitializer
实现一个ApplicationContextInitializer只需要实现它的方法就可以了,这么做会通过SpringFactoriesLoader进行配置,或者通过SpringApplication.addInitializers(…)设置即可
|