付費下載
下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、-載入器,深入剖析Tomcat,第八章 載入器,* web應用程序載入器,即Tomcat中的載入器。 * servlet容器需要實現(xiàn)一個自定義的載入器,而不能使用簡單的系統(tǒng)的類載入器,因為: (1) servlet容器不應該完全相信它正在運行的servlet類,如果使用系統(tǒng)的類載入器,那么servlet就能夠訪問到所有的類,包括JVM中CLASSPATH指明的路徑下的所有類和庫,安全性低。 (2) 可以提供自動重載功能,當可以使用的目錄下的類發(fā)生變化時,Web應用程序會重新載入這些類。,第八章 載入器,* 在Catalina中,載入器是 org.apache.catalina.Loader接口
2、的實現(xiàn) * 支持自動重載,載入器須實現(xiàn) org.apache.catalina.loader.Reloader接口 * 了解兩個術語:倉庫(repository) 和資源(resource) 倉庫:表示類載入器會在哪里搜索要載入的類 資源: 指的是一個類載入器中的DirContext對象,第八章 載入器,Java的類載入器 從J2SE 1.2 開始,JVM使用了三種類載入器來載入所需要的類。 引導類載入器-引導啟動JVM-載入Java核心類-依賴JVM和操作系統(tǒng)版本 擴展類載入器-載入標準擴展目錄中的類-依賴于JDK供應商的具體實現(xiàn) 系統(tǒng)類載入器-默認的載入器,搜索CLASSPATH中指明的路
3、徑和JVR文件,第八章 載入器,JVM如何選擇類載入器?-代理模型 (1) 首先,調用系統(tǒng)類載入器,它將任務交給其父載入器 (2) 擴展類載入器又將任務交給其父載入器 (3) 引導類載入器首先執(zhí)行載入某個類的任務,如果找不到需要載入的類,那么擴展類載入器嘗試載入該類。 (4) 如果擴展類載入器找不到需要載入的類,那么系統(tǒng)類載入器繼續(xù)執(zhí)行載入任務 (5) 如果系統(tǒng)類載入器找不到需要載入的類,則會拋出異常- java.lang.ClassNotFoundException,第八章 載入器,* 為什么要做這樣一個循環(huán)的過程- 代理模型的重要用途就是為了解決類載入過程中的安全問題 看個例子:當程序的某
4、個地方調用了自定義的java.lang.Object類時,系統(tǒng)類載入器會將載入工作 委托給擴展類載入器,繼而會被交給引導類載入器。引導類載入器搜索其核心庫,找到標準的 java.lang.Object 類, 并將之實例化。 結果是,自定義的java.lang.Object類并沒有被載入。 java中類載入機制可以通過繼承抽象類java.lang.ClassLoader類編寫自己的類載入器。Tomcat使用自定義類載入器原因有三條: 為了在載入類中制定某些規(guī)則; 為了緩存已經載入的類; 為了實現(xiàn)類的預載入,方便使用,第八章 載入器,Loader 接口 載入web應用程序中需要的servlet類及
5、相關類需要遵循的一些規(guī)則: 1)應用程序中的servlet只能引用部署在WEB-INF/classes目錄及其子目錄下的類; 2)servlet類不能訪問其他路徑中的類,即使這些類包含在運行當前的Tomcat的jvm的classpath 環(huán)境變量中; 3)此外,servlet類只能訪問WEB-INF/lib目錄下的庫,其他目錄中的類庫不能訪問;,第八章 載入器,* Tomcat載入器指的是web應用程序載入器,而不僅僅指類載入器: 1) 載入器必須實現(xiàn)org.apache.catalina.Loader接口; 2) 使用自定義類載入器,它是org.apache.catalina.loader.
6、WebappClassLoader類的一個實例;(通過Loader接口的getClassLoader() 方法來獲?。?* Loader接口定義了對倉庫的操作:(Tomcat中的倉庫就是WEB-INFO/classes目錄和 WEB-INF/lib 目錄) 1)倉庫:一個web app的倉庫指的是,其WEB-INFO/classes目錄和WEB-INF/lib目錄,這兩個目錄作為倉庫添加到 載入器中; 2)addRepository方法和findRepositories()方法:添加一個新倉庫和返回所有倉庫集合(數(shù)組對象); 3)Tomcat的載入器通常會與一個 Context級別的servl
7、et容器相關聯(lián);,自動重載:如果Context容器中的一個或多個類被修改了, 載入器也可以支持對類的自動重載; 1)Loader接口使用modified()方法來支持類的自動重載:如果倉庫中的一個或多個類被修改了,那么modified()方法會返回true,才能提供自動重載的支持; 2)載入器類本身并不會自動重載:它會調用Context接口(容器)的reload()方法來實現(xiàn); 3)setReloadable()和getReloadable()方法:用來指明是否支持載入器的自動重載;,第八章 載入器,4)自動重載的默認情況:默認情況下是禁用了自動重載的功能的,要想啟動Context容器的自動重
8、載功能,需要再server.xml文件中添加一個Context元素,如下所示: 5)載入器的實現(xiàn)會指明是否要委托給一個父類載入器;(Loader接口中聲明了 getDelegate()方法 和 setDelegate()方法),第八章 載入器,6)org.apache.catalina.Loader的聲明代碼如下: package org.apache.catalina; import java.beans.PropertyChangeListener; public interface Loader public ClassLoader getClassLoader(); public Co
9、ntainer getContainer(); public void setContainer(Container container); public DefaultContext getDefaultContext(); public void setDefaultContext(DefaultContext defaultContext);,第八章 載入器,public boolean getDelegate(); public void setDelegate(boolean delegate); public String getInfo(); public boolean get
10、Reloadable(); public void setReloadable(boolean reloadable); public void addPropertyChangeListener(PropertyChangeListener listener); public void addRepository(String repository); public String findRepositories(); public boolean modified(); public void removePropertyChangeListener(PropertyChangeListe
11、ner listener); ,第八章 載入器,Catalina提供了org.apache.catalina.loader.WebappLoader類作為Loader接口的實現(xiàn): WebappLoader對象中使用 org.apache.catalina.loader.WebappClassLoader 類的實例作為其類載入器,該類繼承自 java.NET.URLClassLoader類; Loader接口及其實現(xiàn)類的UML類圖:,第八章 載入器,Reloader接口 Reloader接口:為了支持類的自動重載功能,類載入器實現(xiàn)需要實現(xiàn)org.apache.catalina.loader.Re
12、loader接口; 最重要的方法:modified方法,其作用是:如果web app中的某個servlet或相關類被修改了,modified方法會返回true,第八章 載入器,WebappLoader類(web應用程序載入器,負責載入web應用程序中所使用到的類) 如上述的UML類圖所示,WebappLoader類實現(xiàn)Runnable接口,它就可以指定一個線程來不斷的調用其類載入器的modified()方法,當調用WebappLoader類的start方法時,會完成以下幾項重要工作: w1)創(chuàng)建一個類載入器; w2)設置倉庫; w3)設置類路徑; w4)設置訪問權限; w5)啟動一個新線程來支
13、持自動重載,第八章 載入器,創(chuàng)建類載入器 WebappLoader類提供了getLoaderClass()方法 和setLoaderClass()方法來獲取或改變其私有變量的loaderClass的值; 1)該私有變量保存了一個字符串類型的值,指明了類載入器所要載入的類的名字; 2)默認情況下: 變量loadClass的值是org.apache.catalina.loader.WebappClassLoader; 3)也可以通過繼承WebappClassLoader類的方式實現(xiàn)自己的類載入器,然后調用setLoaderClass()方法強制WebappLoader實例使用自定義類載入器。否則的
14、話,在它啟動時,WebappLoader類會調用其私有方法createClassLoader()方法來創(chuàng)建 默認的類載入器;,第八章 載入器,private WebappClassLoader createClassLoader() throws Exception Class clazz = Class.forName(loaderClass); WebappClassLoader classLoader = null; if (parentClassLoader = null) classLoader = (WebappClassLoader) clazz.newInstance(); e
15、lse Class argTypes = ClassLoader.class ; Object args = parentClassLoader ; Constructor constr = clazz.getConstructor(argTypes); classLoader = (WebappClassLoader) constr.newInstance(args); return classLoader; ,第八章 載入器,設置倉庫 WebappLoader類的start()方法會調用setRepositories()方法將倉庫添加到其類載入器中。WEB-INF/classes目錄被傳入
16、到類載入器的addRepository()方法中,而WEB-INF/lib目錄被傳入類載入器的setJarPath()方法中。 設置類路徑 在start()方法中調用setClassPath()方法完成。 設置訪問權限 運行Tomcat時,若使用了安全管理器,則setPermissions()方法會為類載入器設置訪問相關的目錄權限,若沒有使用安全管理器,則此方法什么都不做,只是簡單的返回。,第八章 載入器,開啟新線程執(zhí)行類的重新載入 1)WebappLoader類支持自動重載功能:如果倉庫中的類被重新編譯了,那么這個類會自動重新載入,無需重啟tomcat; 2)為了實現(xiàn)這個功能:WebappL
17、oader類使用一個線程周期性地檢查每個資源的時間戳。間隔時間由變量 checkInterval 指定,單位為妙。默認case下, checkInterval的值為15,即每隔15秒會檢查一次是否有文件需要自動重新載入。 getCheckInterval方法和setCheckInterval方法 用于獲取和設置間隔時間; 3)tomcat4中,WebappLoader類實現(xiàn) java.lang.Runnable 接口來支持自動重載。,第八章 載入器,public void run() if(debug = 1) log(“BACKGROUND THREAD Starting”); while(
18、!threadDone) theadSleep(); if(!started) break; try if(!classLoader.modified() continue; cat(Exception e) notifyContext(); break; if(debug = 1) log(“BACKGROUND THREAD Stopping”);,第八章 載入器,對以上代碼的分析(run方法中while循環(huán)會執(zhí)行以下operations): 1)使線程休眠一段時間,時長由變量checkInterval指定,以秒為單位; 2)調用WebappLoader 實例的類載入器的modified方
19、法檢查已經載入的類是否被修改,若沒有類修改,則重新執(zhí)行循環(huán); 3)若某個已經載入的類被修改了,則調用私有方法 notifyContext(),通知與 WebappLoader實例關聯(lián)的 Context容器重新載入相關類;,第八章 載入器,private void notifyContext() WebappContextNotifier notifier = new WebappCotxNotfier(); (new Thread(notifier).start(); notifyContext()方法不會直接調用Context接口的reload方法,它會實例化一個內部類WebappConte
20、xtNotifier ,將其傳入一個新建的線程對象中,并調用線程的start() 方法,此時會執(zhí)行WebappContextNotifier 實例的run()方法,run()方法會調用Context接口的reload()方法。 class WebappContextNotifier implements Runnable public void run() (Context) container).reload(); ,第八章 載入器,WebappClassLoader類 web 應用程序中負責載入類的類載入器是: org.apache.catalina.loader.WebappClassL
21、oader類的實例;此類繼承自.URLClassLoader類。 優(yōu)化:緩存已經加載的類;緩存加載失敗的類的名字,下次 再加載的時候,直接拋出NotFound異常 安全性:不允許載入指定的某些類,名字儲存在變量triggers 中,某些特殊的包及其子包下的類也不允許載入, 也不將載入類的任務委托給系統(tǒng)類載入器去執(zhí)行。,第八章 載入器,類緩存 1)java.lang.ClassLoader類會維護一個Vector對象,保存已經載入的類,防止這些類在不使用時當做垃圾而回收; 2)資源:每個由 WebappClassLoader 載入的類(無論是在WEB-INF/classes 目錄下還是從某個JA
22、R 文件內作為類文件部署), 都視為資源;資源是 org.apache.catalina.loader.ResourceEntry 類的實例。 3)所有已經緩存的類會存儲在resourceEntries的HashMap類型的變量中,其key值就是載入資源的名稱,載入失敗的類的名稱會存儲到另一個名為notFoundResource的HashMap類型的變量中。,第八章 載入器,public class ResourceEntry public long lastModified = -1; public byte binaryContent = null; public Class loaded
23、Class = null; public URL source = null; public URL codeBase = null; public Manifest manifest = null; public Certificate certificates = null; ,第八章 載入器,載入類(WebappClassLoader需要遵守的規(guī)則) 1)因為所有已經載入的類都會緩存起來,所以載入類時要先檢查本地緩存; 2)若本地緩存中沒有,則檢查上一層緩存,即調用 java.lang.ClassLoader 類的findLoadedClass() 方法; 3)若兩個緩存中都沒有,則使用系統(tǒng)的類載入器進行加載,防止 web 應用程序中的類覆蓋J2EE 的類; 4)若啟用了 SecurityM
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 中學黨員教育培訓制度
- 2025年公共文化設施服務與管理手冊
- 兒??萍夹g培訓制度
- 護理培訓師管理制度
- 規(guī)范化培訓教學管理制度
- 2026年工程結構設計師面試題目
- 技術轉移培訓制度
- 合肥公交集團培訓制度
- 教育廳培訓制度
- 航務海事安全培訓制度
- 上腔靜脈綜合征患者的護理專家講座
- 免責協(xié)議告知函
- 部編版八年級上冊語文《期末考試卷》及答案
- 醫(yī)院信訪維穩(wěn)工作計劃表格
- 蕉嶺縣幅地質圖說明書
- 地下車庫建筑結構設計土木工程畢業(yè)設計
- (完整word版)人教版初中語文必背古詩詞(完整版)
- GB/T 2261.4-2003個人基本信息分類與代碼第4部分:從業(yè)狀況(個人身份)代碼
- GB/T 16601.1-2017激光器和激光相關設備激光損傷閾值測試方法第1部分:定義和總則
- PDM結構設計操作指南v1
- 投資學-課件(全)
評論
0/150
提交評論