Springboot 如何确定程序的应用类型 WebApplicationType ?

Springboot 在启动的时候,首先会初始化一个 SpringApplication 对象,具体调用过程如下:

从上面调用方法可知,程序执行时,首先会调用 SpringApplication 的构造方法创建一个 SpringApplication 对象(图3处),而具体的实现在图5处。

【WebApplicationType】

我们将(图5处)SpringApplication 构造方法单独拎出来,在该段代码中的黄色框部分,指明了程序的应用类型(webApplicationType)

我们找到 SpringApplication 该属性的对象类型 WebApplicationType,

然后打开其源码,发现该对象是一个枚举,且里面定义了三个枚举值,分别是 NONE、SERVLET、REACTIVE。

下面三个枚举值的介绍:

NONE

应用程序不应作为 web 应用程序运行,也不应启动嵌入式 web 服务器。

SERVLET应用程序应作为基于 servlet 的 web 应用程序运行,并应启动嵌入式 servlet web 服务器。
REACTIVE应用程序应作为反应式 web 应用程序运行,并应启动嵌入式反应式 web 服务器。

言外之意,我们的 Springboot 项目的程序类型有三种:

(1)非 web 应用程序(不内嵌服务器);

(2)内嵌基于 servlet 的 web 服务器(如:Tomcat,Jetty,Undertow 等,其实现在大多Java网站应用都是采用的基于 Tomcat 的 servlet 类型服务器);

(3)内嵌基于反应式的 web 服务器(如: Netty);

在 servlet 容器当中,采用命令式编程方式,代码一句一句的执行,这样更有利于理解与调试,而在反应式的 web 编程中,是基于异步响应式,现在 WebFlux 框架就是一个较为流行的反应式编程。

既然我们了解到了 Springboot 应用程序的三种类型,那么他又是如何确定当前程序类型的呢?

【WebApplicationType.deduceFromClasspath() 方法】

我们回到刚刚赋值应用类型的那句代码中,可以看到 WebApplicationType.deduceFromClasspath() 这个方法。

打开该方法的实现源码,这里我们就可以看到三个应用类型的获取的代码了。

【ClassUtils.isPresent()】

在这个方法中,反复出现的一个方法就是 ClassUtils.isPresent(),其中里面的参数就是一个包路径类名。那么这个方法又是做什么的呢?我们不妨继续验证下:

我们首先创建一个 Student 类,然后调用 ClassUtils.isPresent() 方法,最后看到方法的返回结果是 true。

 现在我们将参数改为不存在的类名 Student2 执行后,发现为 false。

于是我们可以得出如下结论:

ClassUtils.isPresent() 方法是用来判断一个类的存在性的,当这个类存在,那么返回的就是 true;当这个类不存在时,返回的结果就是 fasle。

【总结】

于是我们回到源代码中,结合常量的定义就不难得出 Springboot 应用类型的判断了:

总结如下:

(1)当项目中存在 DispatcherHandler 这个类,且不存在 DispatcherServlet 类和ServletContainer时,程序的应用类型就是 REACTIVE,也就是他会加载嵌入一个反应式的 web 服务器。

(2)当项目中 Servlet 和 ConfigurableWebApplicationContext 其中一个不存在时,则程序的应用类型为 NONE,它并不会加载内嵌任何 web 服务器。

(3)除了上面两种情况外,其余的都按 SERVLET 类型处理,会内嵌一个 servlet 类型的 web 服务器。

而上面的这些类的判定,都来源于 Spring 的相关依赖包,而这依赖包是否需要导入,也是开发者所决定的,所以说开发者可以决定程序的应用类型,并不是 Srpingboot 本身决定的。

最后附带一张图说明:

 

 

Spring Boot中,可以使用响应式编程来构建应用程序。要使用响应式编程,您需要将spring-boot-starter-webflux模块添加到您的应用程序中。这个模块提供了Spring WebFlux框架,它是Spring对响应式编程的支持。 在添加了spring-boot-starter-webflux模块后,Spring Boot会自动配置Spring WebFlux,以适应大多数应用程序。这意味着您可以使用响应式的WebFlux注解和功能来构建您的应用程序。 但是,需要注意的是,如果您在应用程序中同时添加了spring-boot-starter-web和spring-boot-starter-webflux模块,Spring Boot会自动配置Spring MVC而不是WebFlux。这是因为许多Spring开发人员在他们的Spring MVC应用程序中添加了spring-boot-starter-webflux模块,以使用响应式的WebClient。 如果您想强制执行使用WebFlux,您可以将应用程序类型设置为WebApplicationType.REACTIVE。这样,Spring Boot将强制执行使用Spring WebFlux自动配置。 总结来说,要在Spring Boot中使用响应式编程,您需要添加spring-boot-starter-webflux模块到您的应用程序中。Spring Boot会自动配置Spring WebFlux以适应大多数应用程序。如果需要强制执行使用WebFlux,可以设置应用程序类型WebApplicationType.REACTIVE。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [SpringBoot之响应式编程](https://blog.csdn.net/qq_29860591/article/details/103776555)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值