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

本文將分析springmvc是如何在容器啓動的時候將各個模塊加載完成容器的建立的。web

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

能夠看到,springmvc的核心控制器就是DispatcherServlet。看下DispatcherServlet的繼承關係:設計模式

HttpSerlvetBean繼承自HttpServlet。mvc

HttpServletBean覆寫了init方法,對初始化過程作了一些處理。這個方法是final的,也就是這個方法是不能被繼承的,所以咱們就能夠判定spring在作這裏的時候,也就是初始化的時候的入口就是init方法,這個入口是不能被子類去實現的。init方法中執行了以下的操做:app

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

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

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

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

其實整個這個處理的效果或者用途就是用來將當前的springmvc的容器與他的父容器進行一個關聯,好比:code

wac.setParent(parent);
wac.setServletContext(getServletContext());
wac.setServletConfig(getServletConfig());
wac.setNamespace(getNamespace());

最後將wac這個容器進行一個刷新。

接下來咱們返回上一步,說到的對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是咱們的入口,負責處理一些有關配置文件或者資源的準備,這是由於咱們不少的bean有可能依賴這些資源,而後調用initServletBean()方法開始servlet容器的建立工做,這時候httpServletBean只是建立工做的入口,具體的建立是在他的子類frameWorkServlet中來作的,在frameWorkServlet中負責去跟父容器進行關聯,並建立createWebApplicationContext。而後進入onRefresh()方法也就是他的子類dispaerServlet中取按照策略模式的方式對springmvc中的具體的每一個模塊進行初始化。因此整個過程咱們發現springmvc在作初始化的時候每一個類所作的工做是不同的,也是有分工的。httpservletBean主要是建立一些配置或資源文件,frameWorkServlet主要是建立容器以及跟父容器的關聯。而在dispactorerServlet這個子類中才是真正的去作一些具體的初始化工做。

總結一下各個Servlet的做用:

1. HttpServletBean

 主要作一些初始化的工做,將web.xml中配置的參數設置到Servlet中。好比servlet標籤的子標籤init-param標籤中配置的參數。

2. FrameworkServlet

 將Servlet與Spring容器上下文關聯。其實也就是初始化FrameworkServlet的屬性webApplicationContext,這個屬性表明SpringMVC上下文,它有個父類上下文,既web.xml中配置的ContextLoaderListener監聽器初始化的容器上下文。

3. DispatcherServlet 

 初始化各個功能的實現類。好比異常處理、視圖處理、請求映射處理等。

相關文章
相關標籤/搜索