刚接触Spring Boot的时候,相信大家都有接触过以下代码,这是Spring Boot的启动类,今天就来简单看下Spring Boot的启动流程
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}
首先来看下SpringApplication.run()这个方法的真面目,
public static ConfigurableApplicationContext run(Class<?>[] primarySources,
        String[] args) {
    return new SpringApplication(primarySources).run(args);
}
看源码可以发现这个方法主要做了两件事情
- 初始化SpringApplication实例
- 调用run方法生成context
下面分别来看下这两个流程,以下代码均属于2.1.4版本
SpringApplication实例初始化
首先来看下SpringApplication初始化的流程

可以看到整个流程分为了4步
- 第一步,推断应用程序类型,Spring Boot的应有类型有REACTIVE,SERVLET,NONE   
- 第二步,设置initializers,Spring Boot将会从META-INF/spring.factories中加载相应的ApplicationContextInitializer 

- 第三步,设置listener,Spring Boot将会从META-INF/spring.factories中加载相应的ApplicationListener

- 第四步,加载main方法的定义类 
SpringApplication.run()
下面再来看下run方法的具体实现

- 从META-INF/spring.factories中加载SpringApplicationRunListener 
- 创建参数,即从run方法中传入args
- 设置程序运行所需的环境变量,SpringApplicationRunListener发送environmentPrepared的消息 
- 创建ApplicationContext
- 初始化ApplicationContext,并设置环境变量,SpringApplicationRunListener发送contextLoaded消息
- refresh ApplicationContext
- SpringApplicationRunListener发送started信息
- 完成最终的程序的启动
- SpringApplicationRunListener发送starting消息
总结
- Spring Boot的启动流程主要分为两步,一是初始化SpringApplication,二是调用run()来加载上下文环境
- Spring Boot的应有类型有三种,REACTIVE(响应式web服务),SERVLET(基于servlet的web服务),NONE(非web服务)
- SpringApplication.run()完成默认的执行流程,如果用户需要扩展执行流程,可以先初始化SpringApplication,在通过其setXXX的方法来增加扩展,最后在调用run来完成初始化 - SpringApplication app = new SpringApplication(Application.class) app.setXXX app.run(args)
 
                     
                    