SpringMVC与SpringWebFlux

news2024/9/23 21:28:30

文章目录

    • Spring MVC
      • MVC架构
      • 请求处理流程
      • 语法代码示例
    • Spring WebFlux
      • 请求处理流程
      • 语法代码示例
    • 两者使用对比及建议

Spring MVC

Spring Web MVC是建立在Servlet API上的原始Web框架,从一开始就包含在Spring框架中。正式名称 "Spring Web MVC "来自其源模块的名称(spring-webmvc),但它更常被称为 “Spring MVC”。

SpringMVC是基于Spring的,是Spring中的一个模块,专门用来做web开发使用的。

  • Model 封装了数据与进行数据进行处理的代码,是实际经行数据处理的地方,也是与数据库交互的地方
  • View 负责将应用显示给用户和显示模型的状态,一般来说,它生成客户端浏览器可以解释的 HTML 输出;
  • Controller 负责视图和模型之间的交互,并将其传递给视图进行渲染;

SpringMVC也是一个容器,使用IoC核心技术,管理界面层中的控制器对象。SpringMVC的底层就是servlet,以servlet为核心,接收请求、处理请求,显示处理结果给用户。在此之前这个功能是由Servlet来实现的,现在使用SpringMVC来代替Servlet行驶控制器的角色和功能。 其核心Servlet是:DispatcherServlet。

更多详情查看官方资料这里不在赘述。

MVC架构

请添加图片描述

MVC模式是一种将应用程序分为三个主要部分的架构模式,分别是模型(Model)、视图(View)和控制器(Controller)。模型负责处理数据,视图负责展示数据,控制器负责协调模型和视图之间的交互。

在没有使用SpringMVC之前都是使用Servlet在做Web开发。但是使用Servlet开发在接收请求参数,数据共享,页面跳转等操作相对比较复杂。servlet是java进行web开发的标准,既然springMVC是对servlet的封装,那么很显然SpringMVC底层就是Servlet,SpringMVC就是对Servlet进行深层次的封装。

SpringMVC 是一种基于 Spring 框架的 MVC 设计模型,它是 Spring 框架的一个子项目。SpringMVC 的核心思想是将 MVC 设计模式应用于 Spring 框架,实现了请求-响应模式,将业务逻辑、数据、显示分离,提高了部分代码的复用性,降低了各个模块间的耦合性。

请求处理流程

请添加图片描述

流程描述:

  • 用户发送请求至前端控制器 DispatcherServlet;
  • DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器;
  • 处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器对象及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet;
  • DispatcherServlet 调用 HandlerAdapter 处理器适配器;
  • HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器);
  • Controller 执行完成返回 ModelAndView;
  • HandlerAdaptercontroller执行结果 ModelAndView 返回给 DispatcherServlet;
  • DispatcherServletModelAndView 传给 ViewReslover 视图解析器;
  • ViewReslover 解析后返回具体 View;
  • DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中);
  • DispatcherServlet 响应用户;

语法代码示例

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
@Controller
@RequestMapping("/hello")
public class HelloController{
 
   @RequestMapping(method = RequestMethod.GET)
   public String printHello(ModelMap model) {
      model.addAttribute("message", "Hello Spring MVC Framework!");
      return "hello";
   }

}

Spring WebFlux

与Spring Web MVC并行,Spring Framework 5.0引入了一个响应式Web框架,其名称为 “Spring WebFlux”。与Spring MVC不同,它不需要Servlet API,完全异步和非阻塞,又被叫做响应式WebClient。

Spring WebFlux 模块将默认的 web 服务器改为 Netty,所以具有Netty的特点,是完全非阻塞式的。通过少量的容器线程就可以支撑大量的并发访问,有一种池化思想在里面,所以 Spring WebFlux 可以有效提升系统的吞吐量和伸缩性但是并不能使接口的响应时间缩短。

Spring WebFlux 是一个异步非阻塞式的 Web 框架,所以,它特别适合应用在 IO 密集型的服务中,比如微服务网关这样的应用中。

  • 比如一个日志监控系统,我们的前端页面将不再需要通过“命令式”的轮询的方式不断向服务器请求数据然后进行更新,而是在建立好通道之后,数据流从系统源源不断流向页面,从而展现实时的指标变化曲线;
  • 再比如一个社交平台,朋友的动态、点赞和留言不是手动刷出来的,而是当后台数据变化的时候自动体现到界面上的。

更多信息请查看官方资料这里不在赘述。

请求处理流程

Spring WebFlux 底层实现依赖 reactor 和 netty。Spring 做的就是通过抽象和封装,把 reactor 的能力通过 Controller 来使用。

请添加图片描述

请求执行的流程大致和SpringMVC差不多,SpringMVC核心控制器是DispatcherServlet,SpringWebFlux核心处理器是DispatcherHandler:

  • 先是通过RequestMapping,拿到HandlerMethod处理器;
  • 在通过HandlerMethod寻找合适的HandlerAdapter;
  • 拿到合适的适配器对象之后,根据不同规则的Handler执行不同的Handler,这里就包含Controller
  • Handler的执行结果返回HandlerResult对象,触发handlerResult方法,针对不同的返回类找到不同的HandlerResultHandler如视图渲染ViewResolutionResultHandler、ServerResponseResultHandler、ResponseBodyResultHandler、ResponseEntityResultHandler不同容器有不同的实现,如Reactor,Jetty,Tomcat等;

语法代码示例

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-webflux</artifactId>
    </dependency>
@RestController
@RequestMapping("/webflux")
public class HelloController {

    @GetMapping("/hello")
    public Mono<String> hello() {
        return Mono.just("Hello Spring Webflux");
    }

    @GetMapping("/posts")
    public Flux<Post> posts() {
        WebClient webClient = WebClient.create();
        Flux<Post> postFlux = webClient.get().uri("http://jsonplaceholder.typicode.com/posts").retrieve().bodyToFlux(Post.class);
        return postFlux;
    }
    
}

在 WebFlux 中 Mono 和 Flux 均能充当响应式编程中发布者的角色:

  • Mono:返回 0 或 1 个元素,即单个对象;
  • Flux:返回 N 个元素,即 List 列表对象;

两者使用对比及建议

请添加图片描述

Spring WebFlux 并不是 Spring MVC 的替代方案,两者可以混合使用。都可以使用 Spring MVC 注解,如 @Controller、@RequestMapping等。均可以使用 Tomcat, Jetty, Undertow Servlet 容器。

Spring WebFlux相比较Spring MVC最大的优势在于它是异步非堵塞的框架,可以让我们在不扩充硬件资源的前提下,提升系统的吞吐量和伸缩性;但是由于是异步非堵塞的框架,对于开发人员来说调试起来不太友好。
而 Spring MVC 是同步阻塞的,如果你目前在 Spring MVC 框架中大量使用异步方案,那么,WebFlux 才是你想要的,否则,使用 Spring MVC 才是你的首选。

官方建议:

  • 如果已经有了一个运行良好的 SpringMVC 应用程序,则无需更改。命令式编程是编写、理解和调试代码的最简单方法,我们可以选择最多的库,因为从历史上看,大多数都是阻塞的。
  • 如果是个新应用且决定使用 非阻塞 Web 技术栈,那么 WebFlux 是个不错的选择。
  • 对于使用 Java8 Lambda 或者 Kotlin 且 要求不那么复杂的小型应用程序或微服务来说,WebFlux 也是一个不错的选择
  • 在微服务架构中,可以混合使用 SpringMVC 和 Spring WebFlux,两个都支持基于注解的编程模型
  • 评估应用程序的一种简单方法是检查其依赖关系。如果要使用阻塞持久性 API(JPA、JDBC)或网络 API,那么 Spring MVC 至少是常见架构的最佳选择
  • 如果有一个调用远程服务的 Spring MVC 应用程序,请尝试响应式WebClient
  • 对于一个大型团队,向非阻塞、函数式和声明式编程转变的学习曲线是陡峭的。在没有全局开关的情况下,想启动 WebFlux,可以先使用 reactive WebClient。此外,从小处着手并衡量收益。我们预计,对于广泛的应用,这种转变是不必要的。

当我们引入一门新技术到原有的项目中,我们需要评估究竟为我们带来多少益处,同时还要评估为了这些益处所要付出的学习和改造成本,然后衡量收益,如果收益大值得则值得尝试。不能为了装逼而装逼,为了技术而技术。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/488599.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

控制系统的扰动补偿

名义模型干扰观测器 理论推导 所谓被控对象的名义模型&#xff0c;就是说&#xff0c;实际被控对象无论是通过系统建模还是系统辨识&#xff0c;都无法获得十分精确的参数&#xff0c;名义模型就是与实际系统模型相近的模型&#xff0c;可近似二者相同&#xff0c;即 则 连…

MySQL:常见运算符

前言&#xff1a; 五一过后&#xff0c;我又来啦&#xff01;狂玩五天&#xff0c;放松好心情~ MySQL中的运算符有以下4类&#xff0c;分别是&#xff1a;算数运算符&#xff0c;比较运算符&#xff0c;逻辑运算符&#xff0c;位操作运算符。 算数运算符&#xff1a; 有一定…

【hello Linux】vscode的下载与远程登陆

目录 1. vscode的下载 2. 使用vscode远程登陆至xshell 3. vscode背景颜色的设置 Linux&#x1f337; 1. vscode的下载 1. 点击下方链接进入vscode官网&#xff0c;选择自己所需的vscode版本&#xff0c;直接下载&#xff1b; vscode官网 2. 按如下步骤安装vscode&#xff1b…

USART串口发送

文章目录 运行环境&#xff1a;1.1 串口发送1)用户手册2)原理图 2.1配置1)串口引脚配置2)通讯配置3)RCC和SYS 3.1代码分析3.2添加代码1)串口发送函数2)硬件和驱动安装3)launch设置 4.1实验效果 运行环境&#xff1a; ubuntu18.04.melodic 宏基暗影骑士笔记本 stm32f427IIH6 st…

支持轴体热插拔的平价机械键盘,全尺寸带灯效,雷柏V700DIY上手

日常工作娱乐中少不了键盘&#xff0c;这两年定制化的机械键盘很受欢迎&#xff0c;不过动辄上千的发烧键盘还是让很多朋友望而却步&#xff0c;好在目前市面上也有不少平价款的DIY键盘可以选择&#xff0c;像是我现在用的这款雷柏 V700DIY&#xff0c;就可以轻松定制&#xff…

Distilling Step-by-Step: 可以用更少的训练数据与模型尺寸战胜同级别的LLM!

Distilling Step-by-Step: 可以用更少的训练数据与模型尺寸战胜同级别的LLM&#xff01; IntroductionMethod实验参考 Introduction 作者提到部署大模型存在时延、内存、算力等挑战&#xff0c;所以目前的趋势是微调、蒸馏一个不是很大的语言模型&#xff0c;如Vicuna、Alpaca…

一个WPF开发的、界面简洁漂亮的音频播放器

今天推荐一个界面简洁、美观的、支持国际化开源音频播放器。 项目简介 这是一个基于C# WPF开发的&#xff0c;界面外观简洁大方&#xff0c;操作体验良好的音频播放器。 支持各种音频格式&#xff0c;包括&#xff1a;MP4、WMA、OGG、FLAC、M4A、AAC、WAV、APE 和 OPUS&…

【Python入门知识】NumPy数组迭代及连接

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 数组迭代 迭代意味着逐一遍历元素&#xff0c;当我们在 numpy 中处理多维数组时&#xff0c; 可以使用 python 的基本 for 循环来完成此操作。 如果我们对 1-D 数组进行迭代&#xff0c;它将逐一遍历每个元素。 实例 迭…

openSUSE----openSUSE开启sshd服务

【原文链接】openSUSE----openSUSE开启sshd服务 &#xff08;1&#xff09;首先修改配置&#xff0c;编辑 vi /etc/ssh/sshd_config 文件&#xff0c;将如下两个字段设置为yes PermitRootLogin yes PasswordAuthentication yes&#xff08;2&#xff09;然后搜索firewall&…

Springboot +Flowable,DataObject的使用方式

一.简介 在 Flowable 流程图的绘制过程中&#xff0c;可以编写一个名为 dataObject &#xff08;数据对象&#xff09;的元素&#xff0c;这个元素可以指定变量的 id、名称以及数据类型等各种属性&#xff0c;并且在流程实例启动的时候&#xff0c;会自动将 dataObject 元素的…

Pyinstaller将python文件打包成exe程序——封装LoFTR开源匹配代码

Pyinstaller将python文件打包成exe程序——封装LoFTR开源匹配代码 1.LoFTR代码下载及环境搭建 源码下载&#xff1a;https://github.com/bodhisatan/LoFTR-Stitch 环境搭建&#xff1a;按照github项目中的readme文档进行搭建即可&#xff0c;几乎没有遇到问题&#xff0c;代码…

通用操作日志处理方案

why&#xff08;目的理念&#xff09;&#xff1a;操作日志是什么需要做哪些事情&#xff1f; 摘自美团博客的操作日志的介绍 操作日志的记录格式大概分为下面几种&#xff1a; * 单纯的文字记录&#xff0c;比如&#xff1a;2021-09-16 10:00 订单创建。 * 简单的动态的文本…

计算机网络中的路由选择背后的原理到底是什么样的?

路由选择是计算机网络中一个重要的概念&#xff0c;它指的是当一个数据包在网络中传输时&#xff0c;如何选择最优的路径以达到目的地。路由选择涉及到网络中的路由器和交换机&#xff0c;以及它们之间的通信协议。 本文将介绍路由选择的基本概念、算法和协议&#xff0c;以及…

虹科教您 | 基于Windows系统操作使用RELY-TSN-KIT评估套件

我们曾通过3篇文章详细介绍了如何在Linux系统中使用RELY-TSN-KIT并进行TSN协议测试&#xff0c;而本篇文章则将基于Windows系统来进行介绍。与Linux系统的操作类似的部分&#xff0c;本篇文章不再赘述&#xff0c;欢迎通过下方链接阅读前文&#xff1a; 虹科教您 | 基于Linux系…

UG NX二次开发(C#)-建模-一键获取直线与坐标轴的夹角

文章目录 1、前言2、在UG NX中随便创建几条直线3、在UG NX中的分析操作4、UG NX二次开发实现4.1 基本思路4.2 创建基准坐标系4.3 计算直线与轴向的夹角方法4.4 添加调用方法4.5 代码说明5、测试效果1、前言 在UG NX新版本中,测量的操作都集成在一起了,有读者私下问我,想开发…

OceanBase 4.0(小鱼)入选2023数字中国建设峰会“十大硬核科技”

4 月 27 日 &#xff0c;第六届数字中国建设峰会发布“十大硬核科技”&#xff0c;原生分布式数据库 OceanBase 4.0&#xff08;小鱼&#xff09;入选&#xff0c;这是对 OceanBase 在技术突破上的权威肯定。OceanBase 4.0 是业内首个单机分布式一体化数据库&#xff0c;突破了…

【深度学习】计算机视觉(13)——tensorboard

因为意识到tensorboard的使用远不止画个图放个图片那么简单&#xff0c;所以这里总结一些关键知识的笔记。由于时间问题&#xff0c;我先学习目前使用最多的功能&#xff0c;大部分源码都包含summary的具体使用&#xff0c;基本不需要自己修改&#xff0c;因此tensorboard的解读…

选择云原生是企业进行技术变革的必经之路

前言 众所周知&#xff0c;云计算领域的蓬勃发展&#xff0c;让越来越多的企业将自己的业务搬到云上&#xff0c;上云已经成为大部分企业的首选操作。无论是头部的中大型企业&#xff0c;还是普通的微小企业&#xff0c;企业业务是亘古不变的核心&#xff0c;这关系着企业的命脉…

赋值带随机指针的链表

给你一个长度为 n 的链表&#xff0c;每个节点包含一个额外增加的随机指针 random &#xff0c;该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff0c;其中每个新节点的值都设为其对应的原节点的值。新节点的 n…

云主机如何恢复备份和挂载备份

一、挂载备份&#xff08;优先推荐&#xff09; 1、windows系统: 在主机管理界面&#xff0c;点击【挂载备份盘】 挂载完成以后远程连接到服务器&#xff0c;右键 我的电脑--管理--磁盘管理 可以看到未分配的磁盘 右键未分配的磁盘--更改驱动路径--添加 给磁盘指定一个盘符。…