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容器类型推断的主要内容,如果未能解决你的问题,请参考以下文章

Spring系列

跟着刚哥学习Spring框架--Spring容器

spring中ApplicationContext与BeanFactory容器的区别

Spring 学习

Spring容器的基本使用

spring