亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringMVC源碼分析

發布時間:2020-06-24 19:54:03 來源:網絡 閱讀:573 作者:pogy 欄目:軟件技術

Pogy原創,未經允許,請勿轉載!!!

springMVC是一個建立在spring框架基礎之上的一個web層框架,它負責發送每個請求到合適的處理程序,使用視圖來最終返回響應結果的概念。

 

SpringMVC最重要的一個類是DispatchServlet這個類,當我們打開這個源碼,感到一臉蒙蔽。但是坐下來冷靜一下看看,發現,這個東西竟然繼承了一些類

SpringMVC源碼分析

跟過去看看

SpringMVC源碼分析

好像也沒啥線索,繼續跟

SpringMVC源碼分析

這時有了重大發現,發現這個DispatchServlet終歸結底還是繼承了HttpServlet,那么我們就可以按照普通的servlet的生命周期來分析它了。

Servlet的生命周期大家都還記得吧,不記得沒關系,我來簡單列一下

1.      首先tomcat啟動的時候會去查詢web.xml中的配置文件找到servlet的配置,然后會通過new關鍵字創建這個servlet的實例。

2.      然后調用這個servlet的init方法去初始化,然后把這個servlet放入容器中管理,等待使用。

3.      當容器關閉時,tomcat會調用這個servlet的destroy方法來做一些善后工作。

Ok,下面我們就找init方法吧,看看這里面都干了些什么吧

SpringMVC源碼分析

這里面沒有什么太復雜的邏輯,就是把配置DispatchServlet配置參數加載到內存中,以供spring使用。有的朋友就問了,什么參數

SpringMVC源碼分析主要就是這里面調用了initServletBean方法,這個方法在這個類中是空的,而它的子類實現了它,springmvc中用了很多類似的設計模式,叫模板方法模式。簡單講就是在父類中寫好,你要調用哪些方法,我在子類中去實現,這樣就按照了父類的邏輯順序調用了相應的方法,而且子類可以有不同的實現。

好,下面我么就找哪個子類實現了這個initServletBean方法吧,跟我走。。。

看看這個HttpServletBean的繼承體系如下

SpringMVC源碼分析

先找FrameworkServlet

我們尋尋覓覓,果然沒猜錯,方法的實現,寫在了子類,而且還不少,我來分析下吧

SpringMVC源碼分析

略過日志記錄往下走

調用了當前類中寫的一個方法initWebApplicationContext方法,這個方法就很重要了,坐下來,喝杯茶,慢慢品嘗spring這道美味可口的大餐。

先把源碼粘上來,


第一步spring通過工具類獲取父級WebApplicationContext容器,有的朋友問了,這個父級容器哪來的,何時創建的。

就是在這個監聽器運行的時候創建的,我們知道web服務器啟動的時候,3大組件的創建順序是Listener>Filter >Servlet。

所以這里是可以獲取到父級容器的。當然也可以獲取不到這種情況就不討論了,因為,不可能說你用springMVC而不用spring框架的。

SpringMVC源碼分析

這里有幾個if判斷,我已經標號了,給大家分析一下執行流。

首先webApplicationContext一定是空的,為什么,因為你剛啟動,肯定是空的。所以第一個if暫時不會執行。進入到第二個if了,這里調用了findWebApplicationContext,其實這里也會返回一個null,從這個findwebApplicationContext名稱就知道,它只查找并不創建。把源碼附上,大家看看

SpringMVC源碼分析

因此wac還是空的,所以進入第三個if語句,我們進到createWabApplicationContext方法中一探究竟。

SpringMVC源碼分析

這里的1號代碼塊中是日志,2號代碼塊中式判斷的,3號代碼塊是創建一個可配置的web應用上下文,也就是web容器,4號代碼塊是初始化一下這個容器。比如設置之前的rootContext為父級容器。

最后把這個創建的容器返回,至此,我們的springMVC容器就這樣誕生了。但是還沒結束,在FrameworkinitWebApplicationContext()方法里還有if,我把它粘上來

接著之前的if序號編號

SpringMVC源碼分析

看看這個字段的初始值  

SpringMVC源碼分析

所以這個onRefresh()方法是要執行的,跟進去發現空實現,意料之內的事啦,沒關系的,模板方法模式嘛,找子類,有線索,

SpringMVC源碼分析

這個方法又調用了一個initStrategies(。。)方法,這個方法干了什么勾當 ,跟進去看看

這里我直接加上注釋了

SpringMVC源碼分析

這里我就只跟一個進去看看吧,initMultipartResolver(context),進去看看

SpringMVC源碼分析

注意我畫線的這個段代碼,大家考慮有沒有問題啊,仔細思考哦

當然有問題,我們又沒有在容器中注入這個解析器,它怎么能get到呢,出鬼了。

嘻嘻

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永善县| 察哈| 修文县| 卢湾区| 如皋市| 大丰市| 洮南市| 奉化市| 晋州市| 东安县| 河南省| 凤翔县| 双峰县| 二连浩特市| 化隆| 中江县| 宝丰县| 松滋市| 康乐县| 任丘市| 锦州市| 荥阳市| 陈巴尔虎旗| 青田县| 延寿县| 宜兰县| 丰镇市| 化隆| 农安县| 静海县| 五家渠市| 天水市| 德昌县| 慈溪市| 合川市| 正阳县| 克山县| 新安县| 拉孜县| 香港| 茶陵县|