Spring MVC 源碼跟蹤

按照程序執行流程看下執行順序
當我們發送一個請求的時候,最開始進入的是DispatcherServlet
我們來看下這個類:
在這裏插入圖片描述
查看這個類的引用後,會發現他就是一個標準的Servlet
然而Servlet的生命週期是:
init()——>service()——>distory()
最開始執行init()方法,下面來跟蹤一下執行流程:
在DispatcherServlet父類FrameworkServlet類中沒有發現init()方法,繼續找父類,在HttpServletBean類中發現init()方法:
在這裏插入圖片描述
並且我們發現它是通過final修飾的,這說明什麼,說明了到這重寫完之後其它的子類不能去從寫,也就是說不管寫多少個子類最先走的一定是這個方法(不能被從寫但是public是可以被集成的)。
在這個方法中,重點看一下這個方法initServletBean()初始化bean的方法:
在這裏插入圖片描述
如上圖我們可以看到,它的子類是FrameworkServlet所以它走的就是FrameworkServlet這個類進入這個類的方法實現:
在這裏插入圖片描述
我們看initWebApplicationContext()方法把賦值給了一個全局變量:webApplicationContext(這個是屬於spring)
接下來我們看看initWebApplicationContext()方法給我做了一個什麼事情
在這裏插入圖片描述
rootContext獲取到的Spring容器,空的mac對象被賦值SpringMVC容器
這裏重要的一個操作紅框框處就是設置父容器爲Spring容器,這裏說明了一個問題,Spring跟SpringMVC是父子關係也就是說spring包含了springMVC,也就是說明了SpringMVC容器可以調用Spring中所有的內容。
init()走完它的方法,實現的是初始化的是一個子容器。
在這裏插入圖片描述
這個方法裏面是所以SpringMVC的所有組件:
常用的有一下幾個:
initHandlerMappings()解析請求
initHandlerAdapters()調用方法
initViewResolvers()解析視圖
initMultipartResolver()文件上傳
initHandlerExceptionResolvers()異常映射
接着執行service(),跟蹤看看:
發現DispatcherServlet裏面沒有發現service()方法,只有doService方法
在這裏插入圖片描述
然後我們查看它的父類FrameworkServlet裏面有service()方法:
在這裏插入圖片描述
這裏執行了獲取請求的方法,放行請求,這裏就是獲取判斷方法放行到DispatcherServlet 裏的doService()在這個方法進行了參數的解析,然後放入到map集合裏。
在這裏插入圖片描述
這裏entry.getKey()獲取到的就是web.xml配置的key=“demo”,這裏會進行檢查如果沒有帶"/“就會給它加上”/",也就是說"demo"="/demo"。
在這裏插入圖片描述
在這裏插入圖片描述
這裏就把解析完成的路徑跟需要調用的對象,保存在map集合中
在這裏插入圖片描述
handler強轉成Controller,handleRequest()方法調用它的實現類,這樣就結束了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章