|
Tomcat:正統(tǒng)的類加載架構(gòu)。 通常的Java Web服務(wù)器都實(shí)現(xiàn)了自己的類加載器(一般不止一個(gè))。 正常的Web服務(wù)器要解決如下幾個(gè)問題: (1)部署在一個(gè)服務(wù)器上的兩個(gè)Web應(yīng)用程序所使用的Java類庫可以實(shí)現(xiàn)隔離。 (2)部署在一個(gè)服務(wù)器上的兩個(gè)Web應(yīng)用程序所使用的Java類庫可以實(shí)現(xiàn)共享。 (3)服務(wù)器盡可能的保證自身安全不受部署的Web應(yīng)用程序影響。 (4)支持JSP的Web服務(wù)器,通常都需要支持HotSwap功能。 Tomcat目錄結(jié)構(gòu): 三組目錄(/common/*、/server/*、/shared/*)存放Java類庫,加上應(yīng)用程序本身的 目錄(/WEB-INF/*),一共四組目錄。 (1)common目錄:能被Tomcat和所有Web應(yīng)用程序共享。 (2)server目錄:僅能被Tomcat使用,其他Web應(yīng)用程序不可見。 (3)Shared目錄:可以被所有Web應(yīng)用程序使用,對(duì)Tomcat不可見。 (4)WEB-INF目錄:盡可以被此Web應(yīng)用程序使用,對(duì)其他不可見。 Tomcat類加載器委派關(guān)系:
CommonClassLoader、CatalinaClassLoader、ShareClassLoader、和WebappClassLoader 是 Tomcat自定義加載器,分別對(duì)應(yīng)加載/common/*、/server/*、/shared/*和 /WEB-INF/*類庫, 其中Webapp類加載器和Jsp類加載器會(huì)存在多個(gè),每個(gè)Web 應(yīng)用對(duì)應(yīng)一個(gè)Webapp類加 載器,每個(gè)JSP文件對(duì)應(yīng)Jsp類加載器。 Tomcat類加載器分析: CommonClassLoader加載的類可以被CatalinaClassLoader和ShareClassLoader使 用;CatalinaClassLoader加載的類和ShareClassLoader加載的類相互隔離; WebappClassLoader可以使用ShareClassLoader加載的類,但各個(gè) WebappClassLoader間相互隔離;JspClassLoader僅能用JSP文件編譯的class文件。 OSGi:靈活的類加載結(jié)構(gòu)。 OSGi(Open Service Gateway Initiative):是OSGi聯(lián)盟定制的基于Java語言 的動(dòng)態(tài)模塊化規(guī)范。 OSGi的模塊(Bundle)與普通Java區(qū)別:兩者區(qū)別并不太大,都是以JAR 格式封裝,并且內(nèi)部存儲(chǔ)都是Java Package和Class。但是Bundle可以聲明依賴 的Java Package,也可以聲明它導(dǎo)出發(fā)布的Java Package。Bundle從傳統(tǒng)上層模塊依 賴轉(zhuǎn)變?yōu)槠郊?jí)模塊依賴。QSGi的Bundle類加載器之間只有規(guī)則,沒有固定委派關(guān) 系。 OSGi類加載器關(guān)系: 某個(gè)Bundle聲明依賴的Package,如果有其他Bundle發(fā)布了此Package,則對(duì)這個(gè) 個(gè)package的所有類加載動(dòng)作會(huì)委派它的Bundle了類加載器去完成。 例如: BundleA:聲明發(fā)布PackageA,依賴java.*的包; BundleB:聲明依賴PackageA和PackageC,也同時(shí)依賴java.*; BundleC:聲明發(fā)布PackageC,同時(shí)聲明依賴PackageA。 則關(guān)系圖如下:
OSGi類加載器分析: 可以看出,OSGi類加載器之間不再是雙親委派模型的樹形結(jié)構(gòu),而是進(jìn)一步發(fā)展成 為一種運(yùn)行時(shí)才能確定的網(wǎng)狀結(jié)構(gòu)。這種網(wǎng)狀類加載器結(jié)構(gòu)擁有更優(yōu)秀的靈活性, 同時(shí)也有許多隱患,由于各模塊間依賴關(guān)系錯(cuò)綜復(fù)雜,高并發(fā)量下容易發(fā)生死鎖等 問題。 |
|
|