答案

标注了@ResponseBody的方法返回后,在HandlerAdapter实际调用处理器方法处理请求后,就把返回值写入了Response中了。

方法链和流程描述

SpringMVC-@ResponseBody解析过程 - 图1

  1. DispatcherServletdoDispatch()中通过HandlerAdater(具体实现是RequestMappingHandlerAdater)的handler()
  2. HandlerAdapter通过handleInternal()调用自身的invokeHandlerMethod()
  3. HandlerAdapter#invokeHandlerMethod中会调用ServletInvocableHandlerMethod#setHandlerMethodReturnValueHandlers。具体的ReturnValueHandler有:

image.png
其中我们使用的是RequestResponseBodyMethodProcessor这个ReturnValue处理器,后面会用到

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

    DEBUG动图

    @ResponseBody方法解析方法_ev.gif