##@ResponseBody的处理##
-
RequestMappingHandlerAdapter
对handler进行调用,ServletInvocableHandlerMethod
执行实际的调用.调用之后会使用HandlerMethodReturnValueHandlerComposite
对返回值进行处理. -
HandlerMethodReturnValueHandlerComposite
中其实包含了一个HandlerMethodReturnValueHandler
的列表,遍历列表找出支持当前返回类型的(supportsReturnType
),然后调用其handleReturnValue
方法. -
RequestResponseBodyMethodProcessor
就是上述列表中的一个HandlerMethodReturnValueHandler
,其supportsReturnType如下:@Overridepublic boolean supportsReturnType(MethodParameter returnType) { return ((AnnotationUtils.findAnnotation(returnType.getContainingClass(), ResponseBody.class) != null) || (returnType.getMethodAnnotation(ResponseBody.class) != null));}
这里出现了我们期待已久的@ResponseBody.
##Json的序列化##
RequestResponseBodyMethodProcessor
包含了从RequestMappingHandlerAdapter
传过来的HttpMessageConverter列表
.其handleReturnValue
方法逻辑为:遍历HttpMessageConverter列表
列表,找到可用的HttpMessageConverter
(通过canWrite方法),然后调用HttpMessageConverter
的write
的方法,对handler的结果进行处理.MappingJackson2HttpMessageConverter
是第上一步列表中的一个HttpMessageConverter子类,负责json的序列化和反序列化.其中的序列化方法就是调用ObjectMapper进行处理的.