国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

(轉(zhuǎn)載)漫談Spring的啟動(dòng)與初始化(一)

2019-10-31 10:31 作者:觴翊の澤  | 我要投稿


?2017-03-29?? | ??? | ??2671

地址:https://zouzls.github.io/2017/03/29/SpringStart/

最近幫實(shí)驗(yàn)室同學(xué)調(diào)了個(gè)BUG,項(xiàng)目中也要用到Spring,想想雖然之前也有看過(guò)一些關(guān)于Spring容器的知識(shí),但是有些東西卻已經(jīng)逐漸生疏了或者是模糊了,比如最常見(jiàn)的問(wèn)題,Spring的啟動(dòng)流程是什么樣的?這個(gè)問(wèn)題,我想即使是經(jīng)常做web開(kāi)發(fā)的也不見(jiàn)得能完完整整的回答出來(lái),于是結(jié)合網(wǎng)上資料再配合Spring源碼,決定再梳理一下Spring容器是如何啟動(dòng)并初始化的,如果有不正確的地方,希望路過(guò)的可以指出。

從Tomcat啟動(dòng)開(kāi)始

查閱了大部分網(wǎng)上的文章,基本90%的都是直接從ContextLoaderListener這個(gè)監(jiān)聽(tīng)器開(kāi)始談起,說(shuō)ContextLoaderListener監(jiān)聽(tīng)到了ServletContext的啟動(dòng)然后balabala開(kāi)始啟動(dòng)容器了,但是我想知道監(jiān)聽(tīng)器是什么時(shí)候來(lái)的啊,一切總是有個(gè)開(kāi)始的,不能說(shuō)有個(gè)監(jiān)聽(tīng)器就有個(gè)監(jiān)聽(tīng)器了吧。

初始Tomcat的基本結(jié)構(gòu)

因?yàn)閣eb最終是運(yùn)行在類似于Tomcat這種web容器里面的,它對(duì)于web的生命周期應(yīng)該有著直接的關(guān)系,所以我決定從Tomcat開(kāi)始看起,下面是Tomcat的容器模型:

從上圖可以看出 Tomcat 的容器分為四個(gè)等級(jí),真正管理 Servlet 的容器是 Context 容器,一個(gè) Context 對(duì)應(yīng)一個(gè) Web 工程。尤其是后面一句話,一個(gè) Context 對(duì)應(yīng)一個(gè) Web 工程,所以我們?cè)赥omcat根目錄的webapps文件夾路徑下面經(jīng)常會(huì)看到除了我們自己部署的web,還有若干其他Tomcat自帶的web,不同的web工程都會(huì)對(duì)應(yīng)在Tomcat里面的context容器。

Tomcat的啟動(dòng)

先看這張圖,Tomcat主要類的啟動(dòng)時(shí)序圖:


可以看到Tomcat的啟動(dòng)是從頂層開(kāi)始一直到到Engine到Host再到StandardContext(這里的context我可以理解為就是對(duì)應(yīng)每個(gè)web工程的容器了),之前看過(guò)一些Tomcat的源碼,Tomcat是采用了一種觀察者模式的設(shè)計(jì)方式,所有的容器都會(huì)繼承 Lifecycle 接口,它管理容器的整個(gè)生命周期,所有容器的的修改和狀態(tài)的改變都會(huì)由它去通知已經(jīng)注冊(cè)的觀察者(Listener)。不清楚的可以參考Tomcat生命周期管理。
說(shuō)了這么多還沒(méi)到我們配置在web.xml里面的監(jiān)聽(tīng)器,快了。當(dāng) Context 容器初始化狀態(tài)設(shè)為 init 時(shí),添加在 Context 容器的 Listener 將會(huì)被調(diào)用。ContextConfig 繼承了 LifecycleListener 接口,ContextConfig 類會(huì)負(fù)責(zé)整個(gè) Web 應(yīng)用的配置文件的解析工作。

web應(yīng)用的初始化

Web 應(yīng)用的初始化工作是在 ContextConfig 的 configureStart 方法中實(shí)現(xiàn)的,應(yīng)用的初始化主要是要解析 web.xml 文件,這個(gè)文件描述了一個(gè) Web 應(yīng)用的關(guān)鍵信息,也是一個(gè) Web 應(yīng)用的入口。web.xml 文件中的各個(gè)配置項(xiàng)將會(huì)被解析成相應(yīng)的屬性保存在 WebXml 對(duì)象中,接下去將會(huì)將 WebXml 對(duì)象中的屬性設(shè)置到 Context 容器中,這里包括創(chuàng)建 Servlet 對(duì)象、filter、listener 等等。
所有 web.xml 屬性都被解析到 Context 中,所以說(shuō) Context 容器才是真正運(yùn)行 Servlet 的 Servlet 容器。一個(gè) Web 應(yīng)用對(duì)應(yīng)一個(gè) Context 容器,容器的配置屬性由應(yīng)用的 web.xml 指定,這樣我們就能理解 web.xml 到底起到什么作用了。

再談Spring的啟動(dòng)

啟動(dòng)Spring之前

從上面的流程中,我們知道web.xml配置的最常見(jiàn)的ContextLoaderListener監(jiān)聽(tīng)器是從Tomcat啟動(dòng)時(shí)候創(chuàng)建的。根據(jù)以上Tomcat的啟動(dòng)背景,我們先嘗試簡(jiǎn)單梳理從Tomcat讀取web.xml配置文件到啟動(dòng)Spring的一系列流程。

  1. 在啟動(dòng)Web項(xiàng)目時(shí),容器比如Tomcat會(huì)讀web.xml配置文件中所有的屬性,包括contextConfigLocation和ContextLoaderListener這些等等。

  2. 接著Tomcat會(huì)創(chuàng)建一個(gè)ServletContext(這里的ServletContext可以理解為上述每個(gè)web應(yīng)用對(duì)應(yīng)的Context容器),應(yīng)用范圍內(nèi)即整個(gè)web項(xiàng)目都能使用這個(gè)上下文。

  3. Tomcat將剛剛讀取到contextConfigLocation和ContextLoaderListener這些web.xml中的參數(shù)鍵值對(duì)交給ServletContext。

  4. 創(chuàng)建web.xml 中配置的監(jiān)聽(tīng)器類Listener。在監(jiān)聽(tīng)器類中必須要實(shí)現(xiàn)ServletContextListener接口,接口源代碼如下:


  1. 注意,這個(gè)時(shí)候才剛剛開(kāi)始,你的web項(xiàng)目還沒(méi)有完全啟動(dòng)完成,包括Spring還沒(méi)啟動(dòng)。

由ContextLoaderListener監(jiān)聽(tīng)器啟動(dòng)Spring

因?yàn)镃ontextLoaderListener實(shí)現(xiàn)了用來(lái)監(jiān)聽(tīng)ServletContext事件的ServletContextListener 這個(gè)接口,如果 ServletContext 狀態(tài)發(fā)生變化,將會(huì)觸發(fā)產(chǎn)生對(duì)應(yīng)的ServletContextEvent,然后調(diào)用監(jiān)聽(tīng)器的不同的方法。ContextLoaderListener結(jié)構(gòu)如下:

最終上面的initWebApplicationContext由ContextLoader來(lái)完成,這個(gè)時(shí)候就真正開(kāi)始了Spring容器的初始化了,真是個(gè)激動(dòng)人心的時(shí)刻,百轉(zhuǎn)千回。
下文將仔細(xì)介紹initWebApplicationContext是如何進(jìn)行初始化的。


(轉(zhuǎn)載)漫談Spring的啟動(dòng)與初始化(一)的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
白城市| 云南省| 乌拉特前旗| 通江县| 尼木县| 禹州市| 宝兴县| 祁东县| 岳阳市| 高台县| 锡林郭勒盟| 宁陵县| 南郑县| 抚顺县| 侯马市| 长丰县| 靖州| 东莞市| 湾仔区| 习水县| 平潭县| 乐陵市| 尼木县| 惠安县| 凯里市| 白山市| 汶上县| 南溪县| 乌鲁木齐市| 延庆县| 甘南县| 茌平县| 常宁市| 安新县| 鹿泉市| 南投市| 镇赉县| 曲沃县| 德惠市| 出国| 会东县|