SpringBoot响应流程简单分析(个人初学,学了个大概,顺一下流程。记录一下)

响应流程以向控制台输出json数据格式为例,在控制器里面添加注解@Reponse

@ResponseBody
@RequestMapping("/test/person")
public Person getPerson(){
    Person person = new Person();
    person.setAge(20);
    person.setBrith(new Date());
    person.setUserName("张三");
    return person;
}

然后进行响应追踪,放行直接追踪到真正实现方法的hadle()处理。

// Actually invoke the handler.
	mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

在装配时,先获取到请求的返回值,就是上面需要返回的Person对象。

调用 returnValueHandlers返回值处理器对Person类型进行返回值的处理

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

在进行返回值的处理时,对反回值处理器进行一一匹配,直到找出适合的返回值,这里利用ReponseBodyMethodProcessor进行数据的处理

 做循环处理

for (HandlerMethodReturnValueHandler handler : this.returnValueHandlers) {
			if (isAsyncValue && !(handler instanceof AsyncHandlerMethodReturnValueHandler)) {
				continue;
			}
			if (handler.supportsReturnType(returnType)) {
				return handler;
			}
		}
		return null;
	}

找到ReponseBodyMethodProcessor之后进行数据的跳转处理

writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);

在AbstractMessageConverterMethodProcessor.Java里面进行数据格式的匹配

List<MediaType> mediaTypesToUse = new ArrayList<>();
			for (MediaType requestedType : acceptableTypes) {
				for (MediaType producibleType : producibleTypes) {
					if (requestedType.isCompatibleWith(producibleType)) {
						mediaTypesToUse.add(getMostSpecificMediaType(requestedType, producibleType));
					}
				}
			}

浏览器支持的类型:

最终后台响应所支持的浏览器类型

对数据选择合适的消息类型转换器进行判断,看是否能够写出数据,匹配到7,8。返回的结果都为True。

判断是否能写出数据,携带三个参数,targetType:Person类型的数据 valueType:参数值

selectMediaType:applocation/json。

if (genericConverter != null ?
						((GenericHttpMessageConverter) converter).canWrite(targetType, valueType, selectedMediaType) :

向浏览器写一些数据

if (genericConverter != null) {
							genericConverter.write(body, targetType, selectedMediaType, outputMessage);
						}

调用消息转换器AbstractJackson2HttpMessageConverter对数据进行处理,请求头、编码方式


		MediaType contentType = outputMessage.getHeaders().getContentType();
		JsonEncoding encoding = getJsonEncoding(contentType);
		JsonGenerator generator = this.objectMapper.getFactory().createGenerator(outputMessage.getBody(), encoding);
		try {
			writePrefix(generator, object);

最终调用ObjectWritter()写出json数据

if (contentType != null && contentType.isCompatibleWith(MediaType.TEXT_EVENT_STREAM) &&
					config.isEnabled(SerializationFeature.INDENT_OUTPUT)) {
				objectWriter = objectWriter.with(this.ssePrettyPrinter);
			}
			objectWriter.writeValue(generator, value);

			writeSuffix(generator, object);
			generator.flush();
		}

 返回数据

else {
			writeInternal(t, type, outputMessage);
			outputMessage.getBody().flush();
		}
	}
genericConverter.write(body, targetType, selectedMediaType, outputMessage);
writeWithMessageConverters(returnValue, returnType, inputMessage, outputMessage);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值