码迷,mamicode.com
首页 > 编程语言 > 详细

Spring容器类型推断

时间:2019-08-25 20:12:28      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:条件   过程   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应用。

 

Spring容器类型推断

标签:条件   过程   nbsp   应用   jersey   类型   config   conf   turn   

原文地址:https://www.cnblogs.com/lay2017/p/11408907.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!