springmvc源碼分析----入門看springmvc的加載過程

接上一篇我們寫的入門---http://www.cnblogs.com/duanxiaojun/p/6591448.html

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

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

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

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

這時候我們發現在httpServletBean的這個類中有這個方法,但是沒有實現,而且是一個protocted修飾的方法,這也就是說這個需要子類去實現,好了我們順着人家的代碼進入freamWorkServlet中:

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

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

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

容好了這裏我們不多說哈,有時間的時候我們對springmvc容器與他的父容器spring容器的關係進行一個介紹。

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

在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這個子類中才是真正的去做一些具體的初始化工作。

  好了今天寫到這裏先,下次我要對DispatcherServlet中的每一種策略所做的事情進行一個介紹。然後對springmvc爲什麼這樣安排也進行一個我自己的分析。不對的地方髮夾可以指出來。我的只是一家之言。

 

轉載地址:

http://www.cnblogs.com/duanxiaojun/p/6595419.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章