Spring容器类型推断
Posted lay2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring容器类型推断相关的知识,希望对你有一定的参考价值。
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应用。
以上是关于Spring容器类型推断的主要内容,如果未能解决你的问题,请参考以下文章