文章目录

  • 一、介绍
  • 二、源码分析
  • 三、测试


一、介绍

大多数java后端开发的朋友们想必都是通过创建springboot项目,然后通过编写Controller进行接口开发的,该接口底层是由非响应式的servlet提供支持的,其接口内部逻辑为阻塞式的。但也有一部分朋友是通过响应式的reactive进行接口开发,其接口内部逻辑为非阻塞式的,特点就是代码逻辑异步执行,速度比阻塞式的servlet更快。

本片文章我们探讨springboot是如何知道我们的应用是非响应式的servlet类型的应用,还是响应式的reactive类型的应用呢?下面我们通过对springboot启动流程的源码进行分析,便可得到答案。

二、源码分析

当我们在springboot的主启动类中使用SpringApplicaton.run()启动项目时,其内部其实是先创建一个SpringApplicaton实例,然后对该实例调用其run()方法,如下图所示

bat脚本 检查Java某应用是否启动 如何查看java应用是否启动_servlet

在创建SpringApplicaton实例时,该构造方法内部确定当前应用程序类型并将该类型保存到webApplicationType属性中,如下图所示

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-talwrQCK-1685005308462)(图片\springboot如何创建并配置环境!在这里插入图片描述 )]

从该行代码可以看出,springboot通过调用WebApplicationType的静态方法deduceFromClasspath()推断出当前应用程序类型

我们再进入该静态方法来了解它是如何推断的

bat脚本 检查Java某应用是否启动 如何查看java应用是否启动_应用程序_02

从该方法中看到,推断过程无非就是从类路径中判断是否存在指定的类

  • 如果类路径中存在servlet相关的类,那么当前应用程序就是servlet类型的应用程序
  • 如果类路径中仅存在reactive相关的类,那么当前应用程序就是响应式类型的应用程序
  • 如果以上两种类都不存在,那么当前应用程序就什么类型的应用程序都不是了。

判断类路径中判断是否存在指定的类只需要调用ClassUtils的静态方法isPresent()就行了。而在该静态方法中,则是通过对传入的类进行反射去实例化,如果实例化失败并抛出了异常,则说明该类是不存在的。

三、测试

  • 既不存在reactive相关的类,也不存在servlet相关的类
    在pom中我们仅仅引入springboot的依赖

然后启动项目进入断点,查看当前应用程序的类型,确定为NONE类型的应用程序

bat脚本 检查Java某应用是否启动 如何查看java应用是否启动_应用程序_03

  • 仅存在reactive相关的类
    在pom中我们引入springboot的依赖 和 reactive相关的依赖

然后启动项目进入断点,查看当前应用程序的类型,确定为响应式类型的应用程序

bat脚本 检查Java某应用是否启动 如何查看java应用是否启动_servlet_04

  • 存在servlet相关的类
    在pom中我们引入springboot的依赖 和 servlet相关的依赖

然后启动项目进入断点,查看当前应用程序的类型,确定为servlet类型的应用程序

bat脚本 检查Java某应用是否启动 如何查看java应用是否启动_java_05