Spring Boot启动流程初探

刚接触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);
}

看源码可以发现这个方法主要做了两件事情

  1. 初始化SpringApplication实例
  2. 调用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方法的具体实现

  1. 从META-INF/spring.factories中加载SpringApplicationRunListener
  2. 创建参数,即从run方法中传入args
  3. 设置程序运行所需的环境变量,SpringApplicationRunListener发送environmentPrepared的消息
  4. 创建ApplicationContext
  5. 初始化ApplicationContext,并设置环境变量,SpringApplicationRunListener发送contextLoaded消息
  6. refresh ApplicationContext
  7. SpringApplicationRunListener发送started信息
  8. 完成最终的程序的启动
  9. 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)
    

参考文献


Reprint please specify: wbl Spring Boot启动流程初探

Previous
Spring Boot启动流程扩展 Spring Boot启动流程扩展
Spring Boot启动可扩展流程通过上一篇Spring Boot启动流程详解,我们可知Spring Boot在以下几点可以进行扩展 初始化器(Initializer) 监听器(Listener) Runners 下面依次来看下如何添
2019-05-02
Next
Prometheus查询之Vector match Prometheus查询之Vector match
Vector Matchvector match的含义如下 根据一定的规则,对两个vector的label进行匹配,如果匹配成功,则对两个vector进行运算 vector match有两种类型,一个是one to one,一个是one
2019-04-27