层层递进的关系来分析SpringBoot的部分源码
1. SpringBoot 静态资源源码分析
2. SpringBoot 请求处理源码分析
3. SpringBoot 响应处理源码分析
4. SpringBoot 视图解析器源码分析
1.3 响应处理 1.3.1 响应 JSON相关依赖
web场景自动引入了json场景 org.springframework.boot spring-boot-starter-web 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. 返回值解析器原理- 返回值处理器判断是否支持这种类型
- 返回值调用 handleReturnValue 方法来进行处理
- RequestResponseBodyMethodProcessor 可以处理@RequestBody 注解标注的请求
- 利用 MessageConverters 进行处理 将数据写为 JSON
1. 内容协商(浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型)
2. 服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,
3. SpringMVC会挨个遍历所有容器底层的 HttpMessageConverter ,看谁能处理? - 得到MappingJackson2HttpMessageConverter可以将对象写为JSON
- 利用MappingJackson2HttpMessageConverter将对象转为JSON再写出去。
- 利用 MessageConverters 进行处理 将数据写为 JSON
内容协商
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处理的。



