栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot 响应处理源码分析

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot 响应处理源码分析

层层递进的关系来分析SpringBoot的部分源码

1. SpringBoot 静态资源源码分析

2. SpringBoot 请求处理源码分析

3. SpringBoot 响应处理源码分析

4. SpringBoot 视图解析器源码分析

1.3 响应处理 1.3.1 响应 JSON

相关依赖

    
     org.springframework.boot
       spring-boot-starter-web
     
web场景自动引入了json场景
    
      org.springframework.boot
      spring-boot-starter-json
      2.3.4.RELEASE
      compile
    

通过 debug 模式下,我们能找到在底层有一个返回值解析器

1. 返回值解析器


在返回要返回的值之前,要经过多次进行检测,检测是否为空,是否为字符串等等,等确定是一个返回对象时,执行这个方法:

try {
			this.returnValueHandlers.handleReturnValue(
					returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
		}

进入找到真正执行的方法

	@Override
	public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
			ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception {
		// 找到哪个返回值处理器能处理,然后来进行处理
		HandlerMethodReturnValueHandler handler = selectHandler(returnValue, returnType);
		if (handler == null) {
			throw new IllegalArgumentException("Unknown return value type: " + returnType.getParameterType().getName());
		}
		handler.handleReturnValue(returnValue, returnType, mavContainer, webRequest);
	}

返回值处理器接口

RequestResponseBodyMethodProcessor  	
@Override
	public void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
			ModelAndViewContainer mavContainer, NativeWebRequest webRequest)
			throws IOException, HttpMediaTypeNotAcceptableException, HttpMessageNotWritableException {

		mavContainer.setRequestHandled(true);
		ServletServerHttpRequest inputMessage = createInputMessage(webRequest);
		ServletServerHttpResponse outputMessage = createOutputMessage(webRequest);

		// Try even with null return value. ResponseBodyAdvice could get involved.
        // 使用消息转换器进行写出操作
		writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);
	}

第一个方法用来判断这个返回值处理器是否支持这个返回值

第二个方法就是当支持时,就会调用这个处理方法来进行处理

2. 返回值解析器原理
  1. 返回值处理器判断是否支持这种类型
  2. 返回值调用 handleReturnValue 方法来进行处理
  3. RequestResponseBodyMethodProcessor 可以处理@RequestBody 注解标注的请求
    1. 利用 MessageConverters 进行处理 将数据写为 JSON
      1. 内容协商(浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型)
      2. 服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,
      3. SpringMVC会挨个遍历所有容器底层的 HttpMessageConverter ,看谁能处理?
    2. 得到MappingJackson2HttpMessageConverter可以将对象写为JSON
    3. 利用MappingJackson2HttpMessageConverter将对象转为JSON再写出去。

内容协商

1.3.2 SpringMVC 支持的返回值
ModelAndView
Model
View
ResponseEntity 
ResponseBodyEmitter
StreamingResponseBody
HttpEntity
HttpHeaders
Callable
DeferredResult
ListenableFuture
CompletionStage
WebAsyncTask
有 @ModelAttribute 且为对象类型的
@ResponseBody 注解 ---> RequestResponseBodyMethodProcessor;


1.3.3 HTTPMessageConverter原理

HttpMessageConverter: 看是否支持将 此 Class类型的对象,转为MediaType类型的数据。
例子:Person对象转为JSON。或者 JSON转为Person

默认的MessageConverter


0 - 只支持Byte类型的
1 - String
2 - String
3 - Resource
4 - ResourceRegion
5 - DOMSource.class SAXSource.class) StAXSource.class StreamSource.class Source.class
6 - MultiValueMap
7 - true
8 - true
9 - 支持注解方式xml处理的。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/600866.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号