ServletContext爲IoC容器提供了宿主環境。IoC容器經過ContexLoaderListener初始化創建,ContexLoaderListener是註冊在Web容器中的監聽器,當Web容器初始化時,監聽器會收到該事件從而發起Spring容器的初始化。DispatchServlet是Spring MVC處理請求的轉發器,從而響應HTTP的請求。web
ContexLoaderListener會調用ContextLoader,ContextLoader又會建立XmlWebApplicationContext,XmlWebApplicationContext做爲默認的IoC容器,負責從默認的/WEB-INF/applicationContext.xml
中加載BeanDefinition。app
ContextLoader在建立IoC容器XmlWebApplicationContext後會將其註冊入servletContext的屬性ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
中。post
DispatchServlet負責兩個工做,根據web.xml初始化本身的上下文,響應http請求。url
在ContextLoader加載完成後,開始DispatchServlet的初始化。首先從ServletContext中獲取WebApplicationContext做爲雙親上下文,這裏就是XmlWebApplicationContext,因此XmlWebApplicationContext定義的Bean能夠被DispatchServlet獲取,在DispatchServlet中查找Bean時,會首先從雙親上下文中查找。獲取雙親上下文後,DispatchServlet會建立本身的上下文,而且將其註冊進ServletContext的屬性中,屬性名爲該servlet相關的,由於一個Web容器能夠有多個servlet。spa
DispatchServlet上下文的初始化後會開始建立一些請求處理策略,如LocalResolver、HandlerMappings等。例如,初始化HandlerMappings就是從IoC容器中獲取全部的HandlerMapping相關的Bean。code
HandlerMapping是對HTTP請求到controller的映射,HandlerMapping根據請求獲取一個HandlerExecutionChain,其中包含了一個handler和多個interceptor,interceptor負責功能的加強。xml
例如SimpleUrlHandlerMapping在初始化時會將url和對應handler的bean放入map中保存。當請求到達時,會從SimpleUrlHandlerMapping中查找最長匹配url的handler,包裝成HandlerExecutionChain返回。對象
當請求到來,從全部的HandleMapping中依次查找到匹配的HandlerExecutionChain,多個HandleMapping是按照優先級排序的。排序
HandlerExecutionChain得到後,先對請求執行intercepter的preHandler,而後執行handler,最後再次執行intercepter的postHandler,獲得最終的ModelAndView對象。事件
最後根據ModelAndView渲染視圖並返回。
以JSP視圖爲例。
Step1:ModelAndView得到後,會從中獲取其對應的View,也就是根據ModelAndView指明的名稱得到對應View的Bean。
Step2:View接着將數據進行合併,而後將數據放入requst中進行暴露。
Step3:根據請求,獲取URL路徑,定位資源。如JSP文件。
Step4:將包含數據的requst轉發到目標資源路徑,由web容器負責獲取資源,而且將數據裝入JSP。最後將拼裝好的文件返回。