深入分析SpirngMVC源碼


深入分析SpirngMVC源碼


SpirngMVC流程綜述

  1. 用戶發送請求至前端控制器DispatcherServlet。
  2. DispatcherServlet收到請求調用HandlerMapping處理器映射器。
  3. 處理器映射器找到具體的處理器(可以根據xml配置、註解進行查找),生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
  4. DispatcherServlet調用HandlerAdapter處理器適配器。
  5. HandlerAdapter經過適配調用具體的處理器(Controller,也叫後端控制器)。
  6. Controller執行完成返回ModelAndView。
  7. HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet。
  8. DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器。
  9. ViewReslover解析後返回具體View。
  10. DispatcherServlet根據View進行渲染視圖(即將模型數據填充至視圖中)。
  11. DispatcherServlet響應用戶。


深入分析SpirngMVC源碼


以下開始源碼分析

xml配置文件如下:

<code>
<web-app>\txmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
\txsi:schemaLocation="http://java.sun.com/xml/ns/javaee
\thttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
\t
\t
\t<servlet>
\t\t<servlet-name>springmvc/<servlet-name>
\t\t<servlet-class>org.springframework.web.servlet.DispatcherServlet/<servlet-class>
\t\t<init-param>
\t\t\t<param-name>contextConfigLocation/<param-name>
\t\t\t<param-value>classpath:springmvc.xml/<param-value>
\t\t/<init-param>
\t\t<load-on-startup>1/<load-on-startup>
\t/<servlet>
\t<servlet-mapping>
\t\t<servlet-name>springmvc/<servlet-name>
\t\t<url-pattern>//<url-pattern>
\t/<servlet-mapping>
/<web-app>/<code>

從DispatcherServlet中進入源碼,選中DispatcherServlet,在eclipse中按F4會發現,其實DispatcherServlet是繼承了HttpServlet的,我們都知道HttpServlet 的生命週期是先實例化,初始化,處理請求,銷燬,在初始化時是執行HttpServlet的init()方法,處理請求執行HttpServlet的service()或doGet或doPost方法,銷燬是執行HttpServlet的destory()方法。


深入分析SpirngMVC源碼


init()方法

下面我們來看看init()方法中SpringMVC幹了什麼


深入分析SpirngMVC源碼


最終發現init()是在HttpServletBean類中,並且是final修飾的方法,說明子類中是不存在其他init()方法,在init()方法中調用了initServletBean(),按住CTRL+鼠標左鍵點擊進入查看子類FrameworkServlet的實現。


深入分析SpirngMVC源碼


在FrameworkServlet的initServletBean()方法中調用了initWebApplicationContext()方法,查看其源碼


深入分析SpirngMVC源碼


  • 518行:WebApplicationContext是Spring容器,得到Spring容器rootContext
  • 524行:得到SpringMVC容器wac
  • 533行:將rootContext設置為wac的父容器,所有很多人說Spring是SpringMVC的父容器 其他暫不考慮,有興趣自行了解

service()方法

下面我們來看看service()方法都幹了什麼。


深入分析SpirngMVC源碼


service()方法通過調用processRequest()方法放行請求,processRequest()方法實際是調用了doService()方法


深入分析SpirngMVC源碼


  • 867行:聲明Map集合
  • 874行:給Map集合插入值
  • 880行:給request設置值
  • 893行:最終調用doDispatch()方法


深入分析SpirngMVC源碼


  • 939行:HandlerAdapter在DispatcherServlet中調用 其他先忽略

最後:更多相關資料私信【Java】就可以免費領取噠


深入分析SpirngMVC源碼

上面都是自己整理好的!我就把資料貢獻出來給有需要的人!順便求一波關注,哈哈~各位小夥伴關注我後私信【Java】就可以免費領取噠


分享到:


相關文章: