SpringBoot2:请求处理原理分析-接口方法的返回值处理(returnValueHandlers)

news2024/12/22 13:15:46

一、知识回顾

前面,我们学习了,一个请求过来,先经过filter组件,判断restful风格接口的请求类型。
然后,通过HandlerMapping找到处理该请求的接口。
接着,进入接口方法的参数解析环节,这里主要学习了参数解析器(argumentResolvers)
和数据类型转换服务(Converters),将请求的实参值与方法的形参绑定上。
然后,执行接口方法主体。

那么,方法体执行完后,就到了return环节。就是返回值处理环节。
这一篇,我们就来看一下返回值处理的源码逻辑。

二、测试接口

接下来,我们就对@ResponseBody标注的接口,进行返回值原理探究。

    @ResponseBody  //利用返回值处理器里面的消息转换器进行处理
    @GetMapping(value = "/test/person")
    public Person getPerson(){
        Person person = new Person();
        person.setAge(28);
        person.setBirth(new Date());
        person.setUserName("zhangsan");
        return person;
    }

在这里插入图片描述
我们知道,@ResponseBody标注的接口,都会给页面返回json数据。

三、源码解读

org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter#invokeHandlerMethod
在这里插入图片描述
这里,我们看到了返回值处理器,默认是15个。
在这里插入图片描述
中间的其他步骤,我直接跳过了,进入关键代码
org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite#handleReturnValue
在这里插入图片描述
这里,第一步,先获取能处理这个接口返回值类型的返回值处理器。这个获取逻辑,就是从15个返回值处理器中,循环遍历,找到具体的返回值处理器。
在这里插入图片描述
我们查看下返回值处理器接口规范
在这里插入图片描述
两个方法
supportsReturnType:判断方法
handleReturnValue:处理逻辑
会发现,这个设计模式和参数解析器一样思路。
断点放行下一步,得到@ResponseBody标注的接口的返回值处理器是:
org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor#handleReturnValue
在这里插入图片描述
这个返回值处理方法,我们可以看到,最后一行的方法名
利用消息转换器写数据。
所以,返回值处理器,需要依赖底层的消息转换器

我们在看下消息转换器的具体逻辑
org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor#writeWithMessageConverters(T, org.springframework.core.MethodParameter, org.springframework.http.server.ServletServerHttpRequest, org.springframework.http.server.ServletServerHttpResponse)
在这里插入图片描述
这里又出现一个新的组件,媒体类型
媒体类型:就是请求接口的客户端,如浏览器,postman,传给接口的Accept参数值。
目的就是告诉服务器接口,我能接收那些类型的返回值。
让springboot根据权重,选择最佳返回值返回给浏览器。
在这里插入图片描述
那么,这里就涉及到springboot接口能生产那些类型的返回值。
然后,才能选择最优解。
这个选择过程,就叫内容协商
内容协商:说简单点,就是,浏览器和服务器商量,用什么样的结构数据返回给浏览器。

继续往下看
在这里插入图片描述
这里,我们获取到了,所有浏览器可以接收的返回值类型,和所有springboot可以生产的返回值类型
接下来,就要利用嵌套for循环确定出最终返回值类型。
在这里插入图片描述
在这里插入图片描述
经过循环处理后,得到14个可以返回的数据类型,并对这14个类型进行了权重排序。

m.m.a.RequestResponseBodyMethodProcessor : Using 'application/json;q=0.8', given [text/html, application/xhtml+xml, image/avif, image/webp, image/apng, application/xml;q=0.9, application/signed-exchange;v=b3;q=0.7, */*;q=0.8] and supported [application/json, application/*+json, application/json, application/*+json]

从日志看出,最终协商结果就是,返回json数据格式。

内容协商阶段结束后,就要利用消息转换器(HttpMessageConverter),进行返回值数据格式化了。
Java对象,处理成json结构,返回给浏览器。
在这里插入图片描述
在这里插入图片描述
springboot默认的消息转换器有10中。
那么,哪个消息转换器负责处理json返回值了?

这里,我们依然看一下消息转换器接口规范
在这里插入图片描述
有5个待实现的方法。
在这里插入图片描述
最终,是
org.springframework.http.converter.json.MappingJackson2HttpMessageConverter
来处理json返回类型的数据。
调用对应的write方法,写出json数据给浏览器。

到这里,返回值处理的过程和主要组件介绍完毕。

四、逻辑梳理

简单来说就是以下几步:

首先,请求过来后,DispatcherServlet中,会确定返回值处理器returnValueHandlers
默认有15种。

然后,具体的返回值处理器来进行处理。
返回值处理器中的逻辑如下

1、进行内容协商。
获取客户端发过来的能接收的所有媒体类型(MediaType)。
评估自己能生产的所有数据类型(ProducibleMediaTypes)

springboot默认是从requestHeaders中,获取Accept参数值,作为媒体类型,进行内容协商。
其实,也可以从参数中获取。
后面给出案例。

2、找到具体的消息转换器(HttpMessageConverter)。
springboot默认配置了10种消息转换器。
Java对象write给浏览器。

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

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

相关文章

低代码开发:业务与技术的完美融合

正文: 随着数字化转型的加速,企业对应用软件的需求日益增长。然而,传统的开发方式往往费时费力,难以满足市场的快速变化。在此背景下,低代码开发平台应运而生,它们正逐步改变我们的工作方式,让…

AI辅助设计的底层逻辑与革命性应用

在数字化浪潮席卷各行各业的今天,人工智能(AI)以其强大的数据处理能力和智能决策支持,正逐步渗透到设计领域的每一个角落。AI辅助设计,作为这一趋势的先锋,正以其独特的底层逻辑和创新方法,引领…

基于vue框架的城市环卫车辆管理系统971x5(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:环卫工,车辆信息,车辆借用,车辆报修,通知公告,车辆归还,报修处理,车辆分类,员工打卡,员工请假,加班申请,员工任务 开题报告内容 基于Vue框架的城市环卫车辆管理系统开题报告 一、研究背景与意义 1.1 研究背景 随着城市化进程的加速&…

Vue 介绍与体验

目录 Vue 介绍与体验vue 简介vue 概念vue 特性数据驱动视图双向数据绑定 MVC和MVVM模型vue 版本 Vue的 optionsdata属性methods属性 Vue 的基本使用Vue 安装与使用Vue2 安装与使用(可选) Vue 的调试工具 Vue 介绍与体验 vue 简介 Sum: 概念…

PI电动位移平台简明教程

该文章仅供参考,编写人不对任何实验设备、人员及测量结果负责!!! 0 引言 文章主要介绍PI位移台的硬件连接、软件配置以及软件控制。文章中提到的内容在产品手册中都有说明,强烈建议在操作前通读产品手册,…

【Qt】Qt界面美化 | QSS

文章目录 QSS概述QSS 设置方式1. 指定控件设置样式2. 全局样式设置3. 样式的层叠4. 从文件加载样式表5. 使用 Qt Designer 编辑样式 选择器选择器概述1. 类选择器2. ID选择器3. 子控件选择器(Sub-Controls)4. 伪类选择器(Pseudo-States) 样式属性盒子模型(Box Model) 控件样式实…

YOLOv5改进 | 模块缝合 | C3 融合RFAConv和CBAM注意力机制 【二次融合 小白必备】

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv5入门 改…

系统设计文档示例

设计文档示例 文章目录 设计文档示例一、整体架构二、业务或功能-模块设计2.1、需求说明2.2、交互流程2.3、页面设计2.4、功能实现逻辑2.4.1 API设计2.4.2 DB设计 三、 配置说明四、开发示例 一、整体架构 系统架构图简要说明部署架构图简要说明功能模块图简要说明技术架构:前…

智汇云舟在京举办2024视频孪生产品发布会

9月6日,由北京智汇云舟科技有限公司(以下简称“智汇云舟”)主办的“智算时空 重塑视界”2024视频孪生产品发布会在北京举行。此次活动汇聚了来自科技界的众多精英、合作伙伴及行业媒体,共同见证了视频孪生技术的最新成果与未来展望…

discuz论坛3.4 截图粘贴图片发帖后显示不正常问题

处理方法 source\function 路径下修改function_discuzcode.php function bbcodeurl($url, $tags) 函数 if(!in_array(strtolower(substr($url, 0, 6)), array(http:/, https:, ftp://, rtsp:/, mms://,data:i) 这一句里增加 data:i 即可 function bbcodeurl($url,…

【Java-反射】

什么是反射? JAVA反射机制是在运行状态中,创建任意一个类,能获取这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言…

对云原生架构的理解和思考

云原生到底是什么? 现在大家都在讨论云原生,那么什么是云原生呢?顾名思义云原生便是云上生长出来的东西,用软件开发者的语言来说:就是用云计算的特性来构建、部署和管理应用程序。 说到云原生就不得不说下云计算&…

共享WIFI扫码率低怎么办?做好这些就够了!

随着共享WIFI贴的市场需求和收益空间不断展现,越来越多的人都开始计划加入共享WIFI贴dai li 商的行列之中,以借此成就一番事业。不过,由于不少入局者都在落地过程中遭遇了共享WIFI贴扫码率很低的问题,使得很多人都因害怕步入他们的…

《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》P2

Old 目标检测原来只是定位目标的位置,给出bounding box,现在的目标检测是包括定位和识别的多任务学习。深度学习改变了很多。 每一轮备课都会发现问题,并完善。 New Give the analogy of the character recognition system. 禹晶、肖创柏…

使用Java增删改查数据库

文章目录 前言一、PrepareStatement类是什么?二、实操展示 1.增2.删3.改4.查总结 前言 既然连接数据库都可以通过java语言实现,那么通过java语言对数据库进行增删改查的操作自然是顺理成章的事情了。 一、PrepareStatement类是什么? PrepareS…

基于人工智能的个性化学习推荐系统

目录 引言项目背景环境准备 硬件要求软件安装与配置系统设计 系统架构关键技术代码示例 数据采集与预处理模型训练与推荐实时个性化推荐应用场景结论 1. 引言 个性化学习推荐系统通过人工智能技术,能够根据学习者的学习习惯、兴趣和能力水平,提供最适…

助力企业申报“合肥市首版次高端软件”,安畅提供第三方检测服务

一、合肥市发布首版次软件评定通知 9月4日,合肥市工业和信息化局为开展2024年合肥市首台套重大技术装备首批次新材料首版次软件申报评定工作,发布了《关于开展2024年合肥市首台套重大技术装备首批次新材料首版次软件申报评定工作的通知》。 《通知》对…

如何选择一款合适的高压功率放大器?

带宽:通常厂家放大器带宽都是以正弦波来定义的,例如功率放大器100KHz ,指的是正弦波信号,可以达到的最高频率,而不是方波或者三角波,这些波形由于其高次谐波的影响,不能达到,通常厂家…

飞速(FS)数据中心布线系统线缆颜色编码管理解决方案

有效的数据中心布线管理对于实现高性能和高效率至关重要。然而,要实现有效布线管理存在一些挑战,包括单调的配色方案、复杂的区域布线和多样化的线缆杂乱。数据中心布线管理需要战略性的线缆颜色编码解决方案。本文探讨了数据中心布线管理面临的挑战&…

1、技术选型与前期准备

注意事项:框架选型尽量不要选择最新的框架,选择最新框架半年前左右的稳定版。 框架 旧版本 新版本 Hadoop 3.1.3 3.3.4 Zookeeper 3.5.7 3.7.1 MySQL 5.7.16 8.0.31 Hive 3.1.2 3.1.3(修改源码) Flume 1.9.0 1.10.1 Kafka 3.0.0 3.3…