springboot如何确定当前应用程序是响应式的还是非响应式的

简介: springboot如何确定当前应用程序是响应式的还是非响应式的

一、介绍

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

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

二、源码分析

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

调用SpringApplication实例的run()方法.png

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

SpringApplication构造方法.png

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

WebApplicationType的静态方法deduceFromClasspath().png

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

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

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

三、测试

  • 既不存在reactive相关的类,也不存在servlet相关的类

    在pom中我们仅仅引入springboot的依赖

    仅仅引入springboot的依赖.png

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

NONE类型的应用程序.png

  • 仅存在reactive相关的类

    在pom中我们引入springboot的依赖 和 reactive相关的依赖

    引入springboot的依赖和reactive相关的依赖.png

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

响应式类型的应用程序.png

  • 存在servlet相关的类

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

    引入springboot的依赖和servlet相关的依赖.png

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

servlet类型的应用程序.png



纸上得来终觉浅,绝知此事要躬行。

————————我是万万岁,我们下期再见————————

相关文章
|
6月前
|
开发框架 Java 测试技术
SpringBoot3 响应式网络请求客户端
SpringBoot3 响应式网络请求客户端
|
存储 Java API
如何在Spring Boot应用程序中使用华为云的OBS云存储来上传和删除图片?
如何在Spring Boot应用程序中使用华为云的OBS云存储来上传和删除图片?
332 1
|
Java 应用服务中间件 开发工具
深入了解Spring Boot:简化Java应用程序开发的利器
Spring Boot是一款用于构建Java应用程序的框架,它旨在简化应用程序的开发过程,同时提供了强大的功能和灵活性。无论是构建小型微服务还是大型企业级应用,Spring Boot都可以帮助您快速启动和开发项目。本文将深入介绍Spring Boot的关键概念和功能,以便您能够更好地利用这个强大的工具。
|
1月前
|
Cloud Native Java C++
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
文章介绍如何在Spring Boot 3中利用GraalVM将Java应用程序编译成独立的本机二进制文件,从而提高启动速度、减少内存占用,并实现不依赖JVM运行。
202 1
Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)
|
3月前
|
存储 运维 Java
使用 @Audited 增强Spring Boot 应用程序的数据审计能力
【7月更文挑战第19天】在Spring Boot应用中使用`@Audited`增强数据审计能力涉及在相关实体或方法上添加该注解以标记需审计的操作。例如,在`User`类的`updateUser`方法上使用`@Audited`可记录更新操作的详情。此外,还需配置审计日志存储方式(如数据库)及事件过滤规则等。这有助于满足合规性需求、故障排查及数据分析,对数据安全和完整至关重要。
|
3月前
|
存储 Java 数据库
使用 @Audited 增强Spring Boot 应用程序的数据审计能力
【8月更文挑战第3天】在Spring Boot应用中,`@Audited`注解能显著提升数据审计能力。它可用于标记需审计的方法或类,记录操作用户、时间和类型等信息。此注解支持与Logback或Log4j等日志框架集成,亦可将审计信息存入数据库,便于后续分析。此外,还支持自定义审计处理器以满足特定需求。
151 0
|
4月前
|
NoSQL Java MongoDB
使用Spring Boot构建响应式应用
使用Spring Boot构建响应式应用
|
11月前
|
Java 测试技术 应用服务中间件
使用 Spring Boot 构建应用程序
本指南提供了 Spring Boot 如何帮助您加速应用程序开发的示例。
|
6月前
|
Java 应用服务中间件 Maven
【SpringBoot系列】第一课:构建一个简单的SpringBoot应用程序
【4月更文挑战第3天】构建第一个SpringBoot应用程序
126 1
|
6月前
|
Java 开发者 UED
Spring Boot异常处理:优雅处理应用程序错误
【4月更文挑战第28天】异常处理是任何应用程序开发中不可或缺的一部分。Spring Boot提供了强大的异常处理机制,能够帮助开发者优雅地处理各种错误情况,并向用户提供友好的错误信息。本篇博客将介绍Spring Boot中异常处理的基本概念,并通过实例演示如何实现异常处理。
106 0