
SpringApplication#run(java.lang.Class>, java.lang.String…)

SpringApplication#run(java.lang.Class>[], java.lang.String[])

我们注意这里的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();
}
加载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的信息。


加载META-INF\spring.factories中配置的ApplicationListener。
监听器
