一、介绍
大多数java后端开发的朋友们想必都是通过创建springboot项目,然后通过编写Controller进行接口开发的,该接口底层是由非响应式的servlet提供支持的,其接口内部逻辑为阻塞式的。但也有一部分朋友是通过响应式的reactive进行接口开发,其接口内部逻辑为非阻塞式的,特点就是代码逻辑异步执行,速度比阻塞式的servlet更快。
本片文章我们探讨springboot是如何知道我们的应用是非响应式的servlet类型的应用,还是响应式的reactive类型的应用呢?下面我们通过对springboot启动流程的源码进行分析,便可得到答案。
二、源码分析
当我们在springboot的主启动类中使用SpringApplicaton.run()
启动项目时,其内部其实是先创建一个SpringApplicaton
实例,然后对该实例调用其run()
方法,如下图所示
在创建SpringApplicaton
实例时,该构造方法内部确定当前应用程序类型并将该类型保存到webApplicationType
属性中,如下图所示
从该行代码可以看出,springboot通过调用WebApplicationType
的静态方法deduceFromClasspath()
,推断出当前应用程序类型。
从该方法中看到,推断过程无非就是从类路径中判断是否存在指定的类
- 如果类路径中存在servlet相关的类,那么当前应用程序就是servlet类型的应用程序
- 如果类路径中仅存在reactive相关的类,那么当前应用程序就是响应式类型的应用程序
- 如果以上两种类都不存在,那么当前应用程序就什么类型的应用程序都不是了。
判断类路径中判断是否存在指定的类只需要调用ClassUtils的静态方法isPresent()
就行了。而在该静态方法中,则是通过对传入的类进行反射去实例化,如果实例化失败并抛出了异常,则说明该类是不存在的。
三、测试
既不存在reactive相关的类,也不存在servlet相关的类
在pom中我们仅仅引入springboot的依赖
然后启动项目进入断点,查看当前应用程序的类型,确定为NONE类型的应用程序
仅存在reactive相关的类
在pom中我们引入springboot的依赖 和 reactive相关的依赖
然后启动项目进入断点,查看当前应用程序的类型,确定为响应式类型的应用程序
存在servlet相关的类
在pom中我们引入springboot的依赖 和 servlet相关的依赖
然后启动项目进入断点,查看当前应用程序的类型,确定为servlet类型的应用程序
纸上得来终觉浅,绝知此事要躬行。
————————我是万万岁,我们下期再见————————