目录
run方法(这个做的大部分都是运行是上下文的准备初始化工作)
什么是SpringBoot?
SpringBoot是快速构建基于Spring的企业级应用的框架。
有哪些特征
- 快速构建基于spring的应用。
- 集成了多种容器环境(tomcat,jetty等)运行时无需部署WAR包,可以打成jar文件直接运行。
- 使用starter简化集成配置,starter可以看成是开发过程中的各种场景,比如spring-boot-starter-web 就是开发一个web项目需要用到的各种依赖的集合。
- 自动配置功能,摒弃spring臃肿的xml配置方式。
由上述特征可以猜出来,一个SpringBoot应用在启动过程中肯定有创建webServer、自动装配所需要的的类的过程,本文将从不求甚解的角度先大致梳理出启动过程,里面比较重要的环节比如WebServer、自动装配、监听器等会放到后续文章中。
一切从入口开始
@SpringBootApplication
public class SpringbootStudyApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootStudyApplication.class, args);
}
}
由入口main方法可以看到运行的入口是这个run方法,具体方法实现如下所示
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
return new SpringApplication(primarySources).run(args);
}
构建一个SpringApplication对象并完成初始化
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
// 资源加载器,默认是null
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
// 程序启动主类
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
// web应用类型(servlet,reactive)这里是servlet,这个方法不展开大家可以自己看看
this.webApplicationType = WebApplicationType.deduceFromClasspath();
// bootstrap注册初始化器,我这里是空
this.bootstrapRegistryInitializers = getBootstrapRegistryInitializersFromSpringFactories();
// 加载上下文初始化器
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
// 加载运行时各种事件监听器
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
// 找到main方法所在的类
this.mainApplicationClass = deduceMainApplicationClass();
}
在初始化过程中Initializers、Listeners的初始化是通过META-INF/spring.factories文件完成的该文件一共有2份分别在spring-boot、autoConfig包下,主要过程代码如下
private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {
ClassLoader classLoader = getClassLoader();
// 从文件中读取比如ApplicationListener的所有类并去重
Set<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
// 将读取出来的类初始化
List<T> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);
Annotation