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