答案
标注了@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是
MappingJackson2HttpMessageConverter
DEBUG动图