答案
标注了@ResponseBody的方法返回后,在HandlerAdapter实际调用处理器方法处理请求后,就把返回值写入了Response中了。
方法链和流程描述
- 在
DispatcherServlet的doDispatch()中通过HandlerAdater(具体实现是RequestMappingHandlerAdater)的handler() HandlerAdapter通过handleInternal()调用自身的invokeHandlerMethod()- 在
HandlerAdapter#invokeHandlerMethod中会调用ServletInvocableHandlerMethod#setHandlerMethodReturnValueHandlers。具体的ReturnValueHandler有: 

其中我们使用的是RequestResponseBodyMethodProcessor这个ReturnValue处理器,后面会用到
ServletInvocableHandlerMethod#invokeAndHandler()会调用ServletInvocableHandlerMethod#invokeForRequest()进而触发Controller中的实际方法,并得到返回值- 在
ServletInvocableHandlerMethod#invokeAndHandler()会调用HandlerMethodReturnValueHandlerComposite#handleReturnValue(),这里的HandlerMethodReturnValueHandlerComposite就是在第3步ServletInvocableHandlerMethod#setHandlerMethodReturnValueHandlers的结果。也就是说,上图的一系列ReturnValue处理器均被HandlerMethodReturnValueHandlerComposite所代表。 HandlerMethodReturnValueHandlerComposite#handleReturnValue()首先通过调用自身的selectHandler()选择合适的ReturnValue解析器,这里获取的就是RequestResponseBodyMethodProcessor这个ReturnValue处理器HandlerMethodReturnValueHandlerComposite#handleReturnValue()调用RequestResponseBodyMethodProcessor#handleReturnValue()执行具体的解析逻辑RequestResponseBodyMethodProcessor#handleReturnValue()调用自身的writeWithMessageConverters(),这个方法里会选择合适的MessageConverter。然后对返回值进行解析并塞到Response。MessageConverter有以下内容:
- 具体使用的MessageConverter是
MappingJackson2HttpMessageConverterDEBUG动图

 
