SpringMvc大體流程

今天從這個門裏進去咱們看springmvc是如何在容器啓動的時候將各個模塊加載完成容器的建立的。web

我知道在web.xml文件中咱們是這樣配置springmvc的:spring

咱們的加載的入口就是dispatcherServlet。上一篇中咱們說到了dispatcherServlet的集成關係,也反編譯源碼看到了具體的源碼的截圖。這裏咱們接着上篇中的集成關係說。在上篇說的httpServletBean的init()這個發放是final,也就是這個方法是不能被集成的,所以咱們就能夠判定spring在作這裏的時候,也就是初始化的時候的入口就是init方法,這個入口是不能被子類去實現的。init方法中執行了以下的操做:設計模式

這裏咱們重點關注一下用黑線標註的initServletBean(),try語句塊中的代碼是作一些跟springmvc配置文件,以及資源文件相關的初始化工做,咱們不作深刻的研究,只須要知道相關的在web.xml文件中的配置相關的信息是在這裏處理的,咱們重點關注一下springmvc總體的初始化流程,讓你們瞭解spring是如何加載的。好了咱們看到initServletBean()mvc

這時候咱們發如今httpServletBean的這個類中有這個方法,可是沒有實現,並且是一個protocted修飾的方法,這也就是說這個須要子類去實現,好了咱們順着人家的代碼進入freamWorkServlet中:app

喲  還真是在這裏,並且咱們要關注一下  此時的initServletBean()方法又是一個唄final修改的方法,跟httpservletBean中的init()方法是同樣的,效果做用也同樣咱們就再也不贅述。這裏咱們進入該方法的具體實現。咱們發現這個時候在整個的方法中最關鍵的就是initWebApplicationContext()這個方法,咱們你們對applicationContext應該是比較熟悉的,由於spring的容器其實就是一個context。這時候纔是真正的開始容器的初始化。好了咱們進入initWebApplicationContext()這個方法:url

在這個方法中代碼的前兩行,咱們贏能夠理解,由於springmvc的基於spring的,因此第一步是首先要去獲取parent父容器也就是spring的容器。而後開始根據父容器開始建立springmvc的容器。這裏咱們再進入下一步以前 我覺着有必要對createWebApplicationContext(parent)這塊作一個簡答 的解釋:spa

其實整個這個處理的效果或者用途就是用來將當前的springmvc的容器與他的父容器進行一個關聯,好比wac.setParent(parent);wac.setServletContext(getServletContext());wac.setServletConfig(getServletConfig());wac.setNamespace(getNamespace());,最後將wac這個容器進行一個刷險。設計

容好了這裏咱們很少說哈,有時間的時候咱們對springmvc容器與他的父容器spring容器的關係進行一個介紹。3d

接下來咱們返回上一步,說到的對springmvc的容器和他的父容器進行一個關聯以後進行下一步的操做。 onRefresh(wac);xml

在frameServlet中的initWebApplicationContext方法中的第三行代碼就是這句,可是咱們在frameWorkServlet中看到一樣是一個沒有實現的方法,咱們就應該能夠推斷的出來這個方法的具體實現應該交給他的子類去處理,這時候咱們就要進入到他的子類dispatcherServlet中看到的是以下的實現:

哈哈,到這裏我相信你們應該比較看着順眼一些,這裏纔是咱們再平常的開發中接觸比較多的一些詞或者類。咱們看到在dispaerServlet中的onRefresh()方法中只有一個簡單的initStrategies()方法,看到這個詞Strategies,這是策略的意思,到這裏了跟你們說一下,springmvc中使用到的設計模式----策略模式。好了進入initStrategies()方法後,如上圖,這個時候springmvc就開始去加載對應的一些模塊中主要的組件,好比initMultipartResolver用來springmvc處理文件的上傳,initLocaleResolver(context)用來處理國際話語言相關的一些操做(反正到目前爲止我沒有接觸到。。。。)initThemeResolver().這個是用來處理一些有關動態更換樣式的支持(主題)。好像也沒有使用過。。。initHandlerMappings()這個很重要處理咱們常常聽到的有關url和controller的映射關係,initHandlerAdapters()處理映射有關的適配相關。initHandlerExceptionResolvers(context);springmvc有關異常的處理。initRequestToViewNameTranslator(context)處理請求到視圖名稱的一個轉換。initViewResolvers()處理視圖。針對這幾個策略今天就不細講。下次咱們重點講各個策略在springmvc的初始化過程當中是如何工做的。

       對springmvc的整個的加載過程作一個簡答的總結,再整個加載過程當中httpServletBean是咱們的入口,負責處理一些有關配置文件或者資源的準備,這是由於咱們不少的bena有可能依賴這些資源,而後會開始servlet容器的建立工做從initServletBean()開始,這時候httpServletBean只是建立工做的入口,具體的建立是在他的子類frameWorkServlet中來作的,在frameWorkServlet中負責去跟父容器進行關聯,並建立createWebApplicationContext。而後進入onRefresh()方法也就是他的子類dispaerServlet中取按照策略模式的方式對springmvc中的具體的每一個模塊進行初始化。因此子啊整個過程咱們發現springmvc在作初始化的時候每一個類所作的工做是不同的,也是有分工的。httpservletBean主要是建立一些配置或資源文件,frameWorkServlet主要是建立容器以及跟父容器的關聯。而在dispactorerServlet這個子類中才是真正的去作一些具體的初始化工做。

相關文章
相關標籤/搜索