标签:条件 过程 nbsp 应用 jersey 类型 config conf turn
springboot定义了WebApplicationType枚举,用于指定web应用的类型。
1 public enum WebApplicationType { 2 NONE, // 非WEB应用,不会启动嵌入式WEB容器 3 SERVLET, // 支持Servlet的WEB应用,会启动嵌入式servlet web容器 4 REACTIVE; // 支持reactive的WEB应用,会启动嵌入式reactive web容器 5 // ...... 省略 6 }
在SpringApplication的构造方法中会进行WebApplicationType的推断,决定使用哪一种类型。
1 this.webApplicationType = WebApplicationType.deduceFromClasspath();
核心代码在deduceFromClassPath()方法中
1 static WebApplicationType deduceFromClasspath() { 2 if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null) 3 && !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) { 4 return WebApplicationType.REACTIVE; 5 } 6 for (String className : SERVLET_INDICATOR_CLASSES) { 7 if (!ClassUtils.isPresent(className, null)) { 8 return WebApplicationType.NONE; 9 } 10 } 11 return WebApplicationType.SERVLET; 12 }
第2行代码,先判断了webflux指定的DispatcherHandler这个类是否存在。如果存在,且不存在DispatcherServlet和ServletContainer类,那么就断定是Reactive类型。
如果不符合以上条件,那么默认是SERVLET类型。这时候继续判断与Servlet类型相关的类是否存在,在第6行进行相关类遍历判断:
1)判断Servlet接口是否存在
2)判断ConfigurableWebApplicationContext接口是否存在
如果两者其中有一个不存在,那么就表示也不是Servlet应用,直接断定为NONE类型,非WEB应用。
否则就是SERVLET类型。
推断WebApplicationType的类型,根据classpath下具有标志性的接口或者类作为判断。判断过程先判断是否REACTIVE类型,再判断是否SERVLET类型,如果两者都不是,那么就是非WEB应用。
标签:条件 过程 nbsp 应用 jersey 类型 config conf turn
原文地址:https://www.cnblogs.com/lay2017/p/11408907.html