一、Springboot启动流程
所有的SpringBoot工程,都有自己的启动类,这个启动类身上有一个固定注解@SpringBootApplication,并携带一个main(),通过这个方法即可完成启动。
启动流程,可以分为2个步骤:
1、初始化SpringApplication对象阶段 (加载相关资源,判断是否是个WEB工程,创建一个构造器(完成自动化配置),创建一个ContextLoadLister,加载主启动类所需要所有组件)
2、run启动应用阶段
开启各种容器:tomcat容器,springIOC容器(DispatchServlet,ContextLoaderListener),向各种容器加载组件,并配置容器之间上下文环境
1. 第一步对SpringApplication的初始化
Springboot启动类入口程序,SpringApplication.run方法,先看run方法,再看@SpringBootApplication注解实现的自动配置功能。
run方法点击后,进入源码,如下图所示,会发现最终第二步源码中,实例化了SpringApplication,同时也运行了run方法。
先看SpringApplication的构造方法:它干了什么事情!
代码如下:
public SpringApplication(ResourceLoader resourceLoader, Class<?>… primarySources) {
// resourceLoader 属性注入了 null
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
// 将启动类从数组重新封装成了 Set,注入到 primarySources 属性
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
// 得到 web应用的类型,这里是 SERVLET
/*
webApplicationType 有三种类型,REACTIVE、SERVLET、NONE
引入 spring-boot-starter-web 包,就是 SERVLET
引入 spring-boot-starter-webflux 包,是 REACTIVE
都没有就是 NONE
*/
this.webApplicationType = WebApplicationType.deduceFromClasspath();
//从 META-INF/spring.factories
//文件中得到 key 为 org.springframework.boot.BootstrapRegistryInitializer 的全类名集合,进行实例化,然后注入 bootstrapRegistryInitializers 属性
//其中核心方法getSpringFactoriesInstances,等会详细讲解
this.bootstrapRegistryInitializers = new ArrayList<>(
getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
//这一行代码,只是封装了一下,仍然还是调用 getSpringFactoriesInstances 方法,
//从 META-INF/spring.factories 文件中得到 key 为org.springframework.context.ApplicationContextInitializer 的全类名集合,
//进行实例化,然后注入 initializers(初始化器集合) 属性。
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
// 同理,得到监听器实例的集合,并注入 简单解释getSpringFactoriesInstances就是去spring.factories中读取配置文件
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
// 获取当前运行的 main 方法所在的类,也就是咱们的主类
this.mainApplicationClass = deduceMainApplicationClass();
}
如需转载,请注明文章出处和来源网址:http://www.divcss5.com/html/h64913.shtml