初始化階段
- 在web容器第一次用到DispatchServlet的時候循捺,會創(chuàng)建其對象并執(zhí)行init方法
- init方法內會創(chuàng)建Spring Web容器哑了,并調用容器refresh方法
- refresh過程中會創(chuàng)建并初始化SpringMVC中的重要組件习蓬,比如MultipartResolver, HandlerMapping, HandlerAdapter, HandlerExceptionResolver, ViewResolver等
-
容器初始化后桩卵,會將上一步初始化好的重要組件,賦值給DispatchServlet的成員變量喂饥,留待后用
匹配階段
- 用戶發(fā)送的請求統(tǒng)一到達前端控制器DispatchServlet
- DispatchServlet遍歷所有HandlerMapping置尔,找到與路徑匹配的處理器
- HandlerMapping有多個杠步,每個HandlerMapping會返回不同的處理器對象,誰先匹配榜轿,返回誰的處理器幽歼。其中能識別@RequestMapping的優(yōu)先級最高
- 對象@RequestMapping的處理器是HandlerMethod,它包含了控制器對象和控制器方法信息
- 其中路徑與處理器的映射關系在HandlerMapping初始化時就會建立好
- 將HanderMethod連同匹配到的攔截器谬盐,生成調用鏈對象HandlerExecutionChain返回
-
遍歷HandlerAdapter處理器適配器甸私,找到能處理HandlerMethod的適配器對象,開始調用
執(zhí)行階段
- 執(zhí)行攔截器preHandle
- 由HandlerAdapter調用HandlerMethod
- 調用前處理不同類型的參數(shù)
- 調用后處理不同類型的返回值
- 第2步沒有異常
- 返回ModelAndView
- 執(zhí)行攔截器postHandle方法
- 解析視圖飞傀,得到View對象皇型,進行視圖渲染
- 第2步有異常,進入HandlerExceptionResolver異常處理流程
- 最后都會執(zhí)行攔截器的afterCompletion方法
-
如果控制器方法標注了@ResponseBody注解砸烦,則在第2步弃鸦,就會生成json結果,并標記ModelAndView已處理幢痘,這樣就不會執(zhí)行第3步的視圖渲染