- 从springApplication构造方法开始
@SuppressWarnings({ "unchecked", "rawtypes" })
public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
this.resourceLoader = resourceLoader;
Assert.notNull(primarySources, "PrimarySources must not be null");
this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
// 调用WebApplicationType的静态方法deduceFromClasspath来选择启动的web应用类型
this.webApplicationType = WebApplicationType.deduceFromClasspath();
setInitializers((Collection) getSpringFactoriesInstances(
ApplicationContextInitializer.class));
setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
this.mainApplicationClass = deduceMainApplicationClass();
}
- 看一下WebApplicationType.deduceFromClasspath()方法是怎么选的应用类型的
static WebApplicationType deduceFromClasspath() {
//webflux类存在时,WEBMVC_INDICATOR_CLASS JERSEY_INDICATOR_CLASS不存在时使用WebApplicationType.REACTIVE
if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null)
&& !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null)
&& !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) {
return WebApplicationType.REACTIVE;
}
// 不在SERVLET_INDICATOR_CLASSES类数组中时,web类型为NONE
for (String className : SERVLET_INDICATOR_CLASSES) {
if (!ClassUtils.isPresent(className, null)) {
return WebApplicationType.NONE;
}
}
//默认 SERVLET 类型
return WebApplicationType.SERVLET;
}
SERVLET_INDICATOR_CLASSES数组里面的是什么类
private static final String[] SERVLET_INDICATOR_CLASSES = { "javax.servlet.Servlet",
"org.springframework.web.context.ConfigurableWebApplicationContext" };