SpringMVC:SpringMVC啓動初始化過程

  公司項目使用 struts2 做爲控制層框架,爲了實現先後端分離,計劃將 struts2 切換爲 SpringMVC ,所以,這段時間都在學習新的框架,《Spring實戰》是一本好書,裏面對 Spring 的原理實現以及應用都說得很透徹,強烈推薦,可是若是想深挖 Spring 的實現,仍是要從他的源碼入手,此次,就先從 SpringMVC 初始化開始。前端

  • Web 容器初始化過程java

  • SpringMVC的Web.xml配置web

  • DispatchServlet初始化spring

Web容器初始化過程

web容器初始化的過程,其官方文檔給出了這樣的描述:後端

  1. Instantiate an instance of each event listener identified by a <listener> element in the deployment descriptor.
    For instantiated listener instances that implement ServletContextListener, call the contextInitialized() method.架構

  2. Instantiate an instance of each filter identified by a <filter> element in the deployment descriptor and call each filter instance's init() method.mvc

  3. Instantiate an instance of each servlet identified by a <servlet> element that includes a <load-on-startup> element in the order defined by the load-on-startup element values, and call each servlet instance's init() method.app

其初始化的過程實際以下:
671185-20160720111104763-644678711.jpg框架

SpringMVC 的 web.xml配置

web.xml 配置代碼:前後端分離

<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"  
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
   
    <context-param>  
        <param-name>contextConfigLocation</param-name>  
        <param-value>classpath:applicationContext.xml</param-value>  
    </context-param>  
  
    <listener>  
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>  
    </listener>  
  
  
    <servlet>  
        <servlet-name>mvc-dispatcher</servlet-name>  
        <servlet-class>  
            org.springframework.web.servlet.DispatcherServlet  
        </servlet-class>  
        <load-on-startup>1</load-on-startup>  
    </servlet>  
                                                                                                                                           
    <servlet-mapping>  
        <servlet-name>mvc-dispatcher</servlet-name>  
        <url-pattern>/</url-pattern>  
    </servlet-mapping>  
  
</web-app>
  • <listener>標籤中定義了spring容器加載器

  • <servlet>標籤中定義了spring前端控制器

  在 Servlet API中有一個ServletContextListener接口,它可以監聽ServletContext對象的生命週期,實際上就是監聽Web應用的生命週期。當Servlet容器啓動或終止Web應用時,會觸發ServletContextEvent事件,該事件由ServletContextListener來處理。在ServletContextListener接口中定義了處理ServletContextEvent 事件的兩個方法contextInitialized()和contextDestroyed()。

  ContextLoaderListener監聽器的做用就是啓動Web容器時,自動裝配ApplicationContext的配置信息。由於它實現了ServletContextListener這個接口,在web.xml配置了這個監聽器,啓動容器時,就會默認執行它實現的方法。因爲在ContextLoaderListener中關聯了ContextLoader這個類,因此整個加載配置過程由ContextLoader來完成。

DispatchServlet初始化

在SpringMVC架構中,DispatchServlet負責請求分發,起到控制器的做用。下面詳細來解釋說明:
671185-20160720161437779-899505891.jpg

  • DispatchServlet名如其義,它的本質上是一個Servlet,子類不斷的對HttpServlet父類進行方法擴展

  • HttpServlet有兩大核心方法:init()和service()方法。HttpServletBean重寫了init()方法,在這部分,咱們能夠看到其實現思路:公共的部分統一來實現,變化的部分統一來抽象,交給其子類來實現,故用了abstract class來修飾類名。此外,HttpServletBean提供了一個HttpServlet的抽象實現,使的Servlet再也不關心init-param部分的賦值,讓servlet更關注於自身Bean初始化的實現

  • FrameworkServlet提供了整合web javabean和spring application context的整合方案。在源碼中能夠看到經過執行initWebApplicationContext()方法和initFrameworkServlet()方法實現

  • DispatchServlet是HTTP請求的中央調度處理器,它將web請求轉發給controller層處理,它提供了敏捷的映射和異常處理機制,DispatchServlet轉發請求的核心代碼在doService()方法中實現

DispatchServlet類和ContextLoaderListener類的關係圖:
671185-20160720164251513-1769278820.jpg

用ContextLoaderListener初始化上下文,接着使用DispatchServlet來初始化WebMVC的上下文

相關文章
相關標籤/搜索