日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Tomcat打破雙親委派機制實現隔離Web應用的方法

瀏覽:300日期:2023-03-19 16:51:47
目錄
  • Tomcat類加載器的層次結構
    • WebAppClassLoader
    • SharedClassLoader
    • CatalinaClassLoader
    • CommonClassLoader
  • Spring的加載問題
    • 線程上下文加載器
      • 總結

        Tomcat通過自定義類加載器WebAppClassLoader打破雙親委派,即重寫了JVM的類加載器ClassLoader的findClass方法和loadClass方法,以優先加載Web應用目錄下的類。

        Tomcat負責加載我們的Servlet類、加載Servlet所依賴的JAR包。Tomcat本身也是個Java程序,因此它需要加載自己的類和依賴的JAR包。

        若在Tomcat運行兩個Web應用程序,它們有功能不同的同名Servlet,Tomcat需同時加載和管理這兩個同名的Servlet類,保證它們不會沖突。所以Web應用之間的類需要隔離

        若兩個Web應用都依賴同一三方jar,比如Spring,則Spring jar被加載到內存后,Tomcat要保證這兩個Web應用能共享之,即Spring jar只被加載一次,否則隨著三方jar增多,JVM的內存會占用過大。
        所以,和 JVM 一樣,需要隔離Tomcat本身的類和Web應用的類。

        Tomcat類加載器的層次結構

        Tomcat的類加載器層次結構

        前三個是加載器實例名,不是類名。

        WebAppClassLoader

        若使用JVM默認的AppClassLoader加載Web應用,AppClassLoader只能加載一個Servlet類,在加載第二個同名Servlet類時,AppClassLoader會返回第一個Servlet類的Class實例。
        因為在AppClassLoader眼里,同名Servlet類只能被加載一次。

        于是,Tomcat自定義了一個類加載器WebAppClassLoader, 并為每個Web應用創建一個WebAppClassLoader實例。

        每個Web應用自己的Java類和依賴的JAR包,分別放在WEB-INF/classesWEB-INF/lib目錄下,都是WebAppClassLoader加載的。

        Context容器組件對應一個Web應用,因此,每個Context容器創建和維護一個WebAppClassLoader加載器實例。
        不同加載器實例加載的類被認為是不同的類,即使類名相同。這就相當于在JVM內部創建相互隔離的Java類空間,每個Web應用都有自己的類空間,Web應用之間通過各自的類加載器互相隔離。

        SharedClassLoader

        兩個Web應用之間怎么共享庫類,并且不能重復加載相同的類?

        雙親委派機制的各子加載器都能通過父加載器去加載類,于是考慮把需共享的類放到父加載器的加載路徑。

        應用程序即是通過該方式共享JRE核心類。
        Tomcat搞了個類加載器SharedClassLoader,作為WebAppClassLoader的父加載器,以加載Web應用之間共享的類。

        若WebAppClassLoader未加載到某類,就委托父加載器SharedClassLoader去加載該類,SharedClassLoader會在指定目錄下加載共享類,之后返回給WebAppClassLoader,即可解決共享問題。

        CatalinaClassLoader

        如何隔離Tomcat本身的類和Web應用的類?

        兄弟關系:兩個類加載器是平行的,它們可能擁有同一父加載器,但兩個兄弟類加載器加載的類是隔離的。

        于是,Tomcat搞了CatalinaClassLoader,專門加載Tomcat自身的類。

        問題是,當Tomcat和各Web應用之間需要共享一些類時該怎么辦?

        CommonClassLoader

        共享依舊靠父子關系。
        再增加個CommonClassLoader,作為CatalinaClassLoader和SharedClassLoader的父加載器。

        CommonClassLoader能加載的類都可被CatalinaClassLoader、SharedClassLoader 使用,而CatalinaClassLoader和SharedClassLoader能加載的類則與對方相互隔離。WebAppClassLoader可以使用SharedClassLoader加載到的類,但各個WebAppClassLoader實例之間相互隔離。

        Spring的加載問題

        JVM默認情況下,若一個類由類加載器A加載,則該類的依賴類也由相同的類加載器加載。
        比如Spring作為一個Bean工廠,它需要創建業務類的實例,并且在創建業務類實例之前需要加載這些類。Spring是通過調用Class.forName來加載業務類的,我們來看一下forName的源碼:

        public static Class<?> forName(String className) {    Class<?> caller = Reflection.getCallerClass();    return forName0(className, true, ClassLoader.getClassLoader(caller), caller);}

        會使用調用者,即Spring的加載器去加載業務類。

        Web應用之間共享的jar可交給SharedClassLoader加載,以避免重復加載。Spring作為共享的三方jar,本身由SharedClassLoader加載,Spring又要去加載業務類,按照前面那條規則,加載Spring的類加載器也會用來加載業務類,但是業務類在Web應用目錄下,不在SharedClassLoader的加載路徑下,這該怎么辦呢?

        線程上下文加載器

        于是有了線程上下文加載器,一種類加載器傳遞機制。因為該類加載器保存在線程私有數據里,只要是同一個線程,一旦設置了線程上下文加載器,在線程后續執行過程中就能把這個類加載器取出來用。因此Tomcat為每個Web應用創建一個WebAppClassLoader類加載器,并在啟動Web應用的線程里設置線程上下文加載器,這樣Spring在啟動時就將線程上下文加載器取出來,用來加載Bean。Spring取線程上下文加載的代碼如下:

        cl = Thread.currentThread().getContextClassLoader();

        在StandardContext的啟動方法,會將當前線程的上下文加載器設置為WebAppClassLoader。

        啟動方法結束時,會恢復線程的上下文加載器:

        Thread.currentThread().setContextClassLoader(originalClassLoader);

        這是為什么呢?

        線程上下文加載器其實是線程的一個私有數據,跟線程綁定,這個線程完成啟動Context組件后,會被回收到線程池,之后被用來做其他事情,為了不影響其他事情,需恢復之前的線程上下文加載器。
        優先加載web應用的類,當加載完了再改回原來的。

        線程上下文的加載器就是指定子類加載器來加載具體的某個橋接類,比如JDBC的Driver的加載。

        總結

        Tomcat的Context組件為每個Web應用創建一個WebAppClassLoader類加載器,由于不同類加載器實例加載的類是互相隔離的,因此達到了隔離Web應用的目的,同時通過CommonClassLoader等父加載器來共享第三方JAR包。而共享的第三方JAR包怎么加載特定Web應用的類呢?可以通過設置線程上下文加載器來解決。

        多個應用共享的Java類文件和JAR包,分別放在Web容器指定的共享目錄:

        CommonClassLoader
        對應 <Tomcat>/common/*

        CatalinaClassLoader
        對應 <Tomcat >/server/*

        SharedClassLoader
        對應 <Tomcat >/shared/*

        WebAppClassloader
        對應 <Tomcat >/webapps/<app>/WEB-INF/*

        可以在Tomcat conf目錄下的Catalina.properties文件里配置各種類加載器的加載路徑。

        當出現ClassNotFound錯誤時,應該檢查你的類加載器是否正確。
        線程上下文加載器不僅僅可以用在Tomcat和Spring類加載的場景里,核心框架類需要加載具體實現類時都可以用到它,比如我們熟悉的JDBC就是通過上下文類加載器來加載不同的數據庫驅動的。

        到此這篇關于Tomcat打破雙親委派機制實現隔離Web應用的方法的文章就介紹到這了,更多相關Tomcat 隔離Web應用內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

        標簽: Tomcat
        相關文章:
        日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
        久久国产小视频| 久久三级视频| 成人久久一区| 国产一区二区视频在线看| 亚洲毛片一区| 国产在线成人| 欧美 日韩 国产精品免费观看| 福利精品一区| 精品国产网站| 91综合网人人| 国产成人精品福利| 高清av一区| 特黄特色欧美大片| 精品美女在线视频| 日韩欧美久久| 不卡专区在线| 成人污污视频| 久久久成人网| 日韩中文在线电影| 日韩欧美一区二区三区免费观看| 久久久久美女| 亚洲一区二区三区在线免费| 日韩二区三区在线观看| 国产美女视频一区二区| 国产成人精品三级高清久久91| 伊人久久大香线蕉av不卡| 欧美亚洲三级| 久久xxxx精品视频| 国产精品色在线网站| 麻豆精品久久| 欧美日本久久| 久久久久久久久久久9不雅视频| 夜夜精品视频| 日本天堂一区| 久久最新视频| 天堂成人免费av电影一区| 日韩在线观看不卡| 久久成人福利| 免费视频一区二区| 制服诱惑一区二区| 亚洲精品免费观看| 午夜日韩影院| 88久久精品| 麻豆成人在线| 国产一区二区三区视频在线| 欧美在线91| 日韩国产欧美在线播放| 日本午夜大片a在线观看| 另类专区亚洲| 亚洲成人av观看| 成人av三级| caoporn视频在线| 人人精品久久| 丝袜美腿成人在线| 999在线观看精品免费不卡网站| 欧洲亚洲一区二区三区| 黄色在线网站噜噜噜| 国产自产自拍视频在线观看| 91亚洲一区| 日韩精品dvd| 三级亚洲高清视频| 999精品色在线播放| 成人一二三区| 精品精品国产三级a∨在线| 国产精品99久久免费观看| 日韩精品免费一区二区夜夜嗨 | 亚洲欧美视频一区二区三区| 欧美一级精品| 欧美日韩视频| 欧美日韩水蜜桃| 蜜桃av在线播放| 亚洲天堂1区| 欧美日韩国产精品一区二区亚洲| 欧美日韩激情| 午夜宅男久久久| 日韩avvvv在线播放| 久久三级毛片| 欧美一区久久久| 自拍日韩欧美| 日本99精品| 成人国产精品一区二区网站| 久久久久一区| 综合激情婷婷| 精品成人18| 日韩精品网站| 日本一区免费网站| 欧美激情日韩| 免费在线小视频| 亚洲精品自拍| 亚洲精品福利电影| 亚洲主播在线| 欧美激情亚洲| 五月天激情综合网| 国产精品三p一区二区| 亚洲天堂免费电影| 老鸭窝亚洲一区二区三区| 国产精品色婷婷在线观看| 日韩一区自拍| 久久国内精品| 欧美一区二区三区高清视频 | 综合亚洲视频| 久久精品国产99| 国产福利电影在线播放| 亚洲综合在线电影| 日韩欧美中文字幕一区二区三区| 国产精品麻豆久久| 日韩不卡一区二区三区| 精品欧美一区二区三区在线观看| 国产亚洲观看| 国产精品久久久久毛片大屁完整版| 久久青草久久| 久久精品国产亚洲aⅴ| 国产色播av在线| 国产精一区二区| 综合激情视频| 日韩一区二区免费看| 日韩精品一卡| а√天堂8资源在线| 卡一卡二国产精品| 欧美日韩一区二区高清| 夜夜嗨av一区二区三区网站四季av| 国产精品日韩精品在线播放| 日韩三级久久| 亚洲精品成人一区| 日韩午夜在线| 午夜欧美精品| 99久久精品网站| 成人黄色av| 国产不卡一区| 精品久久国产一区| 视频在线不卡免费观看| 精品国产欧美| www在线观看黄色| 色婷婷综合网| 福利在线免费视频| 999视频精品| 在线亚洲成人| 亚洲精品综合| 日本国产欧美| 国产高清精品二区| 色在线中文字幕| 黄色成人91| 亚洲主播在线| 日韩av中文在线观看| 国产精品毛片视频| 福利在线一区| 久久精品91| 亚洲欧美日韩一区在线观看| 亚洲字幕久久| 美日韩一区二区三区| 亚洲www免费| 丝袜脚交一区二区| 国内精品伊人| 久久国产福利| 久久丁香四色| 视频一区中文| 国产精品久久亚洲不卡| 欧美www视频在线观看| 999精品色在线播放| 亚洲麻豆一区| 日韩欧美国产精品综合嫩v| 免费视频一区二区| 亚洲女同av| 日韩avvvv在线播放| 欧美日韩激情| 国产一区二区三区日韩精品 | 日韩在线观看一区二区| 国产精品欧美大片| 最新亚洲一区| 欧美国产小视频| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品亚洲欧美| 日韩中文字幕区一区有砖一区| 免费一级欧美在线观看视频 | 麻豆久久久久久| 在线亚洲激情| 涩涩av在线| 老鸭窝一区二区久久精品| 亚洲主播在线| 日韩中文在线电影| 国产精品1区| 久久激五月天综合精品| 日本亚洲最大的色成网站www | 国产精品久久久久av蜜臀 | 欧美sm一区| 久久精品国产99国产| **爰片久久毛片| 亚洲一区欧美二区| 亚洲第一区色| 福利一区二区免费视频| 日韩美女国产精品| 伊人影院久久| 精品一区亚洲| 久久精品99久久无色码中文字幕| 成人美女视频| 伊人久久高清| 999国产精品永久免费视频app| 日本免费一区二区三区四区| 日韩欧美中文| 久久人人97超碰国产公开结果|