SpringApplication初始化
springboot版本:2.2.9.RELEASE。
main
SpringApplication#run(java.lang.Class<?>, java.lang.String…)
SpringApplication#run(java.lang.Class<?>[], java.lang.String[])
我们注意这里的new SpringApplication(primarySources)
new SpringApplication(primarySources)
初始化SpringApplication
SpringApplication#SpringApplication(java.lang.Class<?>…)
SpringApplication#SpringApplication(org.springframework.core.io.ResourceLoader, java.lang.Class<?>…)
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
// 资源加载器设置为null
this.resourceLoader = resourceLoader;
// 加载类资源不能为null
Assert.notNull(primarySources, "PrimarySources must not be null");
// 将数组primarySources转换为List,放入LinkedHashSet里。
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
// 推断应用类型,当前项目为WebApplicationType.SERVLET。
this.webApplicationType = WebApplicationType.deduceFromClasspath();
// 加载classpath下(项目中),META-INF\spring.factories中配置的ApplicationContextInitializer。
setInitializers((Collection) getSpringFactoriesInstances(ApplicationContextInitializer.class));
// 加载META-INF\spring.factories中配置的ApplicationListener。
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
// 根据调用栈推断main方法主类
this.mainApplicationClass = deduceMainApplicationClass();
}
setInitializers
加载classpath下(项目中),META-INF\spring.factories中配置的ApplicationContextInitializer。
初始化器类
SpringApplication#getSpringFactoriesInstances(java.lang.Class)
SpringApplication#getSpringFactoriesInstances(java.lang.Class, java.lang.Class<?>[], java.lang.Object…)
SpringFactoriesLoader.loadFactoryNames这个方法我们在:自动配置(第三方依赖中的bean),中讲到过,
作用就是加载META-INF\spring.factories的信息。
setListeners
加载META-INF\spring.factories中配置的ApplicationListener。
监听器