@ResponseBody的作用就是將返回的對象通過MessageConverter處理之后,寫入response的outputStream中返回。大致流程如下
1.在DispatcherServlet中調用doDispatch方法,該方法中有如下代碼。這里的ha為RequestMappingHandlerAdapter,這個對象怎么來的,簡單點說就是通過request的請求路徑匹配到執行器鏈,通過執行器鏈中的處理器匹配到對應的適配器,暫時不做深入討論。
2.handle方法會走到RequestMappingHandlerAdapter的handleInternal中
3.調用invokeHandlerMethod方法
4.查看invokeAndHandle方法,這里就到了本文的重點了
5.查看handleReturnValue
6.查看selectHandler
7.這里遍歷預置的處理器是否支持返回值的類型。這里的returnValueHanlers比較多,有15個。對應@ResponseBody注解的為RequestResponseBodyMethodProcessor。直接看該對象的supportsReturnType方法。
8.匹配到RequestResponseBodyMethodProcessor之后就執行該第5步中該對象的handleReturnValue
到此,@ResponseBody注解的作用就講完了。
順帶一提,配置了視圖解析器之后,通常情況下為ViewNameMethodReturnValueHandler這個類來處理視圖。
這里是15個returnValueHandler的截圖
總結:簡單的講,@ResponseBody注解就是為了RequestResponseBodyMethodProcessor處理返回值提供標識。
如有不對之處望指教。