1. 程式人生 > >SpringMVC學習(01)--前端控制器DispatcherServlet的初始化

SpringMVC學習(01)--前端控制器DispatcherServlet的初始化

一、DispatcherServlet的初始化過程
DispatcherServlet,也就是我們的前端控制器,它是SpringMVC的核心,那麼,Spring容器在初始化DispatcherServlet的時候做了什麼?
先看一下DispatcherServlet類的整合關係
類繼承關係
1、呼叫init()方法
init()方法在在HttpServlet中定義,在HttpServletBean中有實現,
HttpServletBean.int()
可以看到:
a、web.xml中配置的引數是通過HttpServletBean的內部類ServletConfigPropertyValues儲存的
b、DispatcherServlet是通過BeanWrapper類構造完成的,並將上面的屬性設定到DispatcherServlet中。為什麼這樣做,原因是,我們web.xml的配置

<servlet>
  <servlet-name>dispatcher</servlet-name>  
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
  <load-on-startup>1</load-on-startup>  
  <init-param>
    <param-name>contextConfigLocation</param-name>
<param-value>classpath:springConfig/dispatcher-servlet.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>

contextConfigLocation引數是在子類FrameWorkServlet中定義的,HttpServletBean中沒有這個屬性的定義,第二,利用Spring的注入,使用setPropertyValues方法就可將contextConfigLocation屬性設定到對應例項中,也就是以依賴注入的方式初始化屬性。(BeanWrapper是Bean的包裝,可以訪問Bean的屬性描述器,也可以對Bean的屬性進行設定獲取,通過BeanWrapper,IOC容器可以用統一的方式來訪問Bean的屬性)。

2、FrameWorkServlet.initServletBean()方法
initServletBean
initWebApplicationContext
由上面的程式碼,可以知道
a、FramWorkServlet的作用就是,將Servlet和Spring通過上下文聯絡起來
需要注意的是,註釋中的根上下文指的是web.xml中配置的ContextLoaderListener監聽器中根據contextConfigLocation路徑生成的上下文。

<context-param>
  <param-name>contextConfigLocation</param-name>  
  <param-value>classpath:springConfig/applicationContext.xml</param-value>  
</context-param>
<listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
</listener>

3、DispatcherServlet.onRefresh()
onRefresh
如上,此方法的作用就是初始化各個策略介面,比如
異常處理初始化initHandlerExceptionResolvers方法
檢視處理初始化initViewResolvers方法
請求對映處理初始化initHandlerMappings方法
這些將在後面解釋。

整個MVC的初始化工作就此完成,總結一個這幾個介面/類的主要職責
1、HttpServletBean
初始化工作,將初始化引數,設定到Servlet中,比如,web.xml中servlet標籤的init-para配置的引數。
2、FramWorkServlet
將Servlet與Spring容器相關聯。也就是初始化屬性webApplicationContext,這個引數代表的就是Spring容器的上下文,這個上下文有個父類的上下文,就是既web.xml中配置的ContextLoaderListener監聽器初始化的容器上下文
3、DispatcherServlet
初始化各個元件介面,比如請求對映,檢視處理,異常處理。