SpringMVC原理及流程解析

前言前端

    春節期間宅在家裏閒來無事,對SpringMVC進行了比較深刻的瞭解,將以前模糊不清的地方基本摸索清楚了,特此撰文總結記錄一下。web

正文spring

1、一個請求爲何會調用到SpringMVC框架裏?編程

    首先問你們一個問題,爲何一個請求能進入SpringMVC的框架代碼裏?設計模式

    答案就是Servlet。Web容器在啓動的時候會對Servlet進行初始化,對應到SpringMVC中就是將DispatcherServlet初始化,而當請求到來的時候,Web容器(如tomcat)會調用servlet的doService方法,從而進入DIspatcherServlet的處理邏輯。tomcat

    因此,SpringMVC這個輕量級Web框架,本質上是對Servlet的封裝。在其中封裝了大量的便捷功能,讓咱們能夠不用操做冗長的Servlet代碼,就能便捷的開發。mvc

2、SpringMVC框架處理的流程app

    流程圖網上有不少,此處我就隨便找一個粘貼過來了... 下面看圖說話框架

 

     請求過來以後調用Servlet的doService方法,此方法在DispatcherServlet中進行了實現,處理核心邏輯的方法是doDispatch()方法。spa

    2中是先進入處理器映射器-HandlerMapping中,獲取對應的HandlerExecutionChain。HandlerMapping是什麼?這要從springmvc注入Controller的方式提及,有兩種,分別爲:在類上加@Controller註解,這也是咱們最經常使用的;還有一種是實現Controller接口或HttpRequestHandler接口。這兩種對應不一樣的MappingHandler,分別爲:RequestMappingHandlerMapping、BeanNameUrlHandlerMapping。因此第二步就是分別調一下這兩個handlerMapping,看看哪一個能匹配處處理請求的MethodHandler,能匹配到就將MethodHandler封裝成HandlerExecutionChain返回。

    3是匹配處理器適配,從2中拿到MethodHandler執行體以後,在3中匹配對應的HandlerAdapter。此處用了策略的設計模式,HandlerAdapter接口中的support方法負責判斷是不是由當前擴展類處理,handle方法對當前請求進行處理。有三個實現類,分別爲RequestMappingHandlerAdapter、HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter。默認是RequestMappingHandlerAdapter。

    4是獲得處理器適配器後,調用其handle方法將請求轉到對具體目標方法的調用。不一樣的實現類在調用handle方法時用不一樣的方式組裝方法參數、調用方法。好比RequestMappingHandlerAdapter的handle方法經過反射調用到目標方法,而實現Controller接口的會直接調用接口方法。調用完以後獲得ModelAndView。

    5是經過ViewResolver對ModelAndView進行解析,獲得視圖後給前端渲染。

     因此看下來,SpringMVC的重點其實就是2/3/4這三步。

3、SpringMVC框架的擴展點

    首先HandlerMapping能夠擴展,實現接口並放入handlerMappings集合中便可。可是這須要對現有框架作較大改動,由於Controller中的方法也要放入這個HandlerMapping實現類中,因此通常只有框架做者纔會作此類擴展。

    其次HandlerAdapter能夠擴展,一樣實現接口並放入handlerAdapters集合中便可。

    最後經過實現接口 org.springframework.web.servlet.config.annotation.WebMvcConfigurer重寫其中的方法,往裏添加ViewResolver、ArgumentResolver等類來實現對視圖的解析、對參數的解析。

    經過上面能夠看到,一個好的框架是如何經過面向接口編程來預留擴展點的。 

4、總結

     一個好的框架,核心思路以及流程可能並不複雜,可是當儘量多的增長上擴展點、填充上針對各類場景的處理邏輯後,就會顯得總體繁雜,使得新人剛看一個框架源碼是不明就裏,而當你能透過這繁雜的表象看清其精簡的核心時,你也就理解了設計者的思想。

    本文主要給本身查漏補缺用,寫的深一腳淺一腳,若有有異議的地方還請指正!

相關文章
相關標籤/搜索