SpringMVC源碼解讀

1.SpringMVC簡介

SpringMVC框架是圍繞一個DispatherServlet來設計的。這個Servlet會把請求分發給各個處理器,並支持可配置的處理器映射、視圖渲染、本地化、時區與主題渲染等,甚至還支持文件上傳。處理器是應用中使用註解@Controller和@RequestMapping的類和方法,Spring爲處理器方法提供了極其靈活的配置。前端

「對擴展開放」是Spring web MVC 框架的一個重要的設計原則,而對應Spring整個框架來講,其設計原則是「對擴展開放,對修改關閉」。java

2.關於DispatherServlet

從這張圖能夠清晰的看出,DispatherServlet本質上就是一個Servlet。web

引伸:Servlet生命週期spring

2.DispatherServlet初始化過程

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
                      http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
   version="3.1" metadata-complete="true">

    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext.xml</param-value>
    </context-param>

   <servlet>
      <servlet-name>spring</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:spring-servlet.xml</param-value>
      </init-param>
   </servlet>
   <servlet-mapping>
      <servlet-name>spring</servlet-name>
      <url-pattern>/</url-pattern>
   </servlet-mapping>

    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

</web-app>

1.Servlet 是個接口api

public void init(ServletConfig config) throws ServletException;

2.GenericServlet 中實現了初始化方法mvc

public void init(ServletConfig config) throws ServletException {app

this.config = config;
this.init();//空方法,留給子類實現
}

3.HttpServlet 沒有對初始化相關的方法進行覆蓋框架

4.HttpServletBean,重寫了init()方法ide

其中又調用了一個initServletBean();方法,這本類中也是個空實現。this

 

5.FrameworkServlet 重寫了上邊留空的方法:initServletBean();

initServletBean方法中最重要的就是調用了一個initWebApplicationContext() 方法。

initWebApplicationContext()內部調用了onRefresh(), 這個方法在本類中爲空實現,留給子類去實現。

6.DispatcherServlet,找到onRefresh()

 

@Override
protected void onRefresh(ApplicationContext context) {
initStrategies(context);
}
protected void initStrategies(ApplicationContext context) {
initMultipartResolver(context);
 initLocaleResolver(context);
 initThemeResolver(context);
 initHandlerMappings(context);
 initHandlerAdapters(context);
 initHandlerExceptionResolvers(context);
 initRequestToViewNameTranslator(context);
 initViewResolvers(context);
 initFlashMapManager(context);
}

至此,DispatherServlet初始化完畢!

3.DispatherServlet工做原理

①:DispatcherServlet是springmvc中的前端控制器(front controller),負責接收request並將request轉發給對應的處理組件.

②:HanlerMapping是springmvc中完成url到controller映射的組件.DispatcherServlet接收request,而後從HandlerMapping查找處理request的controller.

③:Cntroller處理request,並返回ModelAndView對象,Controller是springmvc中負責處理request的組件(相似於struts2中的Action),ModelAndView是封裝結果視圖的組件.

④ ⑤ ⑥:視圖解析器解析ModelAndView對象並返回對應的視圖給客戶端.

4.幾個關鍵的類或接口

HandlerMapping

HandlerExecutionChain

HandlerInterceptor

HandlerAdapter

View

5.分步講解源碼

相關文章
相關標籤/搜索