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

您的位置:首頁技術(shù)文章
文章詳情頁

Tomcat打破雙親委派機(jī)制實(shí)現(xiàn)隔離Web應(yīng)用的方法

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

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

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

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

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

        Tomcat類加載器的層次結(jié)構(gòu)

        Tomcat的類加載器層次結(jié)構(gòu)

        前三個(gè)是加載器實(shí)例名,不是類名。

        WebAppClassLoader

        若使用JVM默認(rèn)的AppClassLoader加載Web應(yīng)用,AppClassLoader只能加載一個(gè)Servlet類,在加載第二個(gè)同名Servlet類時(shí),AppClassLoader會返回第一個(gè)Servlet類的Class實(shí)例。
        因?yàn)樵贏ppClassLoader眼里,同名Servlet類只能被加載一次。

        于是,Tomcat自定義了一個(gè)類加載器WebAppClassLoader, 并為每個(gè)Web應(yīng)用創(chuàng)建一個(gè)WebAppClassLoader實(shí)例。

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

        Context容器組件對應(yīng)一個(gè)Web應(yīng)用,因此,每個(gè)Context容器創(chuàng)建和維護(hù)一個(gè)WebAppClassLoader加載器實(shí)例。
        不同加載器實(shí)例加載的類被認(rèn)為是不同的類,即使類名相同。這就相當(dāng)于在JVM內(nèi)部創(chuàng)建相互隔離的Java類空間,每個(gè)Web應(yīng)用都有自己的類空間,Web應(yīng)用之間通過各自的類加載器互相隔離。

        SharedClassLoader

        兩個(gè)Web應(yīng)用之間怎么共享庫類,并且不能重復(fù)加載相同的類?

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

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

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

        CatalinaClassLoader

        如何隔離Tomcat本身的類和Web應(yīng)用的類?

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

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

        問題是,當(dāng)Tomcat和各Web應(yīng)用之間需要共享一些類時(shí)該怎么辦?

        CommonClassLoader

        共享依舊靠父子關(guān)系。
        再增加個(gè)CommonClassLoader,作為CatalinaClassLoader和SharedClassLoader的父加載器。

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

        Spring的加載問題

        JVM默認(rèn)情況下,若一個(gè)類由類加載器A加載,則該類的依賴類也由相同的類加載器加載。
        比如Spring作為一個(gè)Bean工廠,它需要?jiǎng)?chuàng)建業(yè)務(wù)類的實(shí)例,并且在創(chuàng)建業(yè)務(wù)類實(shí)例之前需要加載這些類。Spring是通過調(diào)用Class.forName來加載業(yè)務(wù)類的,我們來看一下forName的源碼:

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

        會使用調(diào)用者,即Spring的加載器去加載業(yè)務(wù)類。

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

        線程上下文加載器

        于是有了線程上下文加載器,一種類加載器傳遞機(jī)制。因?yàn)樵擃惣虞d器保存在線程私有數(shù)據(jù)里,只要是同一個(gè)線程,一旦設(shè)置了線程上下文加載器,在線程后續(xù)執(zhí)行過程中就能把這個(gè)類加載器取出來用。因此Tomcat為每個(gè)Web應(yīng)用創(chuàng)建一個(gè)WebAppClassLoader類加載器,并在啟動Web應(yīng)用的線程里設(shè)置線程上下文加載器,這樣Spring在啟動時(shí)就將線程上下文加載器取出來,用來加載Bean。Spring取線程上下文加載的代碼如下:

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

        在StandardContext的啟動方法,會將當(dāng)前線程的上下文加載器設(shè)置為WebAppClassLoader。

        啟動方法結(jié)束時(shí),會恢復(fù)線程的上下文加載器:

        Thread.currentThread().setContextClassLoader(originalClassLoader);

        這是為什么呢?

        線程上下文加載器其實(shí)是線程的一個(gè)私有數(shù)據(jù),跟線程綁定,這個(gè)線程完成啟動Context組件后,會被回收到線程池,之后被用來做其他事情,為了不影響其他事情,需恢復(fù)之前的線程上下文加載器。
        優(yōu)先加載web應(yīng)用的類,當(dāng)加載完了再改回原來的。

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

        總結(jié)

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

        多個(gè)應(yīng)用共享的Java類文件和JAR包,分別放在Web容器指定的共享目錄:

        CommonClassLoader
        對應(yīng) <Tomcat>/common/*

        CatalinaClassLoader
        對應(yīng) <Tomcat >/server/*

        SharedClassLoader
        對應(yīng) <Tomcat >/shared/*

        WebAppClassloader
        對應(yīng) <Tomcat >/webapps/<app>/WEB-INF/*

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

        當(dāng)出現(xiàn)ClassNotFound錯(cuò)誤時(shí),應(yīng)該檢查你的類加載器是否正確。
        線程上下文加載器不僅僅可以用在Tomcat和Spring類加載的場景里,核心框架類需要加載具體實(shí)現(xiàn)類時(shí)都可以用到它,比如我們熟悉的JDBC就是通過上下文類加載器來加載不同的數(shù)據(jù)庫驅(qū)動的。

        到此這篇關(guān)于Tomcat打破雙親委派機(jī)制實(shí)現(xiàn)隔離Web應(yīng)用的方法的文章就介紹到這了,更多相關(guān)Tomcat 隔離Web應(yīng)用內(nèi)容請搜索以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持!

        標(biāo)簽: Tomcat
        相關(guān)文章:
        日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
        久久亚洲资源中文字| 精品精品99| 久久免费黄色| 亚洲国产福利| 国产精品yjizz视频网| 都市激情国产精品| 国产白浆在线免费观看| 成人精品久久| 亚洲风情在线资源| 久久男女视频| 精品中文字幕一区二区三区av| 精品国产欧美日韩一区二区三区| 国产精品久久久久久久久免费高清| 国产欧美一区二区三区国产幕精品 | 另类国产ts人妖高潮视频| 亚洲深夜福利| 日韩区欧美区| 国产精品sss在线观看av| 国产精品免费大片| 国产一区三区在线播放| 国产一二在线播放| 91精品国产91久久久久久黑人| 久久久久美女| 国产二区精品| 免费人成网站在线观看欧美高清| 综合在线一区| 国产精品成人国产| 91麻豆国产自产在线观看亚洲| 亚洲成人国产| 免费在线看一区| 国产欧美二区| 日韩精品dvd| 欧美在线亚洲| 91精品啪在线观看国产爱臀| 欧美精品91| 偷拍精品精品一区二区三区| 欧美日韩四区| 久久国产三级精品| 国产成人黄色| 亚洲综合精品四区| 国产福利一区二区三区在线播放| 国产66精品| 国产精品社区| 国产精品嫩草影院在线看| 韩国久久久久久| 一区二区精彩视频| 国产一区2区在线观看| 亚洲黄色影院| 麻豆精品视频在线观看| 欧美中文字幕一区二区| 日本不卡高清| 日韩电影免费网站| 欧美中文日韩| 国产精品99久久免费观看| 伊人久久国产| 亚洲精品一级| 国产传媒在线观看| 亚洲午夜免费| 日韩在线免费| 欧美日韩18| 亚洲韩日在线| 国产精品hd| 蘑菇福利视频一区播放| 精品一区电影| 亚洲精品韩国| 日本精品在线中文字幕| 亚洲精品综合| 欧美成a人免费观看久久| 六月婷婷一区| 日韩欧美不卡| 国产情侣久久| 视频在线观看91| 成人片免费看| 国产精品一区二区三区四区在线观看 | 国产一区欧美| 国产精品久久久久久久久久妞妞| 欧美sss在线视频| 欧美日一区二区三区在线观看国产免| 久久久精品网| 国产精品va视频| 蜜臀精品久久久久久蜜臀| 欧美成人a交片免费看| 日韩精品成人| 五月天激情综合网| 精品成人18| 日韩av在线播放中文字幕| 欧美日韩水蜜桃| 国产一区二区三区亚洲综合| 婷婷综合电影| 欧美日韩激情在线一区二区三区| 鲁大师精品99久久久| 欧美大黑bbbbbbbbb在线| 亚洲国产福利| 久久av偷拍| 日本aⅴ精品一区二区三区| 日韩一级欧洲| 99免费精品| 超碰在线99| 久久不卡国产精品一区二区| 亚洲永久精品唐人导航网址| 亚洲网站视频| 亚洲va中文在线播放免费| 国产精品porn| 91亚洲精品视频在线观看| 亚洲综合日韩| 伊人久久成人| 亚洲1234区| 岛国精品一区| 美女视频黄久久| 国产精品日韩精品中文字幕| 日本aⅴ精品一区二区三区 | 亚洲网址在线观看| 欧美日韩国产免费观看| 日韩久久精品网| 国产精品99在线观看| 免费在线亚洲欧美| 国产精品永久| 国产视频一区二| 日本中文字幕一区二区视频 | 激情久久婷婷| 一区二区三区午夜视频| 欧美精品羞羞答答| 神马午夜久久| 中文在线а√天堂| 欧美日韩在线精品一区二区三区激情综合| 欧美在线综合| 免费的成人av| 亚洲精品乱码久久久久久蜜桃麻豆| 欧美日韩精品一本二本三本| 欧美日韩国产免费观看视频| 五月精品视频| 亚洲一区二区三区高清不卡| 欧美三区四区| 欧美日中文字幕| 在线成人直播| 亚洲一区二区三区四区五区午夜| 亚洲一区二区三区四区五区午夜 | 亚洲精品麻豆| 欧美亚洲国产日韩| 国产精品天天看天天狠| 另类欧美日韩国产在线| 精品入口麻豆88视频| 国产一区调教| 激情亚洲影院在线观看| 国产91久久精品一区二区| 9国产精品视频| 免费精品视频最新在线| 日本不卡中文字幕| 麻豆精品在线视频| 91亚洲一区| 91精品国产调教在线观看| 婷婷综合五月| 日本一区福利在线| 欧美激情综合| 久久青青视频| 日韩视频在线一区二区三区 | 7m精品国产导航在线| 国产精品免费99久久久| 高清一区二区| 欧美大黑bbbbbbbbb在线| 日韩中文欧美在线| 欧美精品影院| 精品国产亚洲一区二区三区大结局| 91欧美国产| 黄色免费成人| 人人精品人人爱| 国产精品调教| 日韩大片在线| 免费成人av在线播放| 欧美亚洲三区| 蜜桃av.网站在线观看| 午夜宅男久久久| 国产精品久久久一区二区| 电影天堂国产精品| 视频一区国产视频| 国产精品宾馆| 久久狠狠婷婷| 日本在线不卡视频| 日韩av有码| 蜜桃视频在线观看一区| 国产精品亚洲一区二区在线观看 | 国产精品久久久久久久久久齐齐| 亚洲午夜天堂| 婷婷综合成人| 日本久久成人网| 日本不卡视频在线观看| 激情国产在线| 亚洲综合五月| 日韩88av| 亚洲精品在线二区| 国产美女高潮在线观看| 亚洲一二三区视频| 天堂√8在线中文| 亚洲精品福利| 麻豆精品久久| 蜜臀91精品一区二区三区| 成人一区而且| 日韩精品视频中文字幕| 欧美日韩亚洲在线观看| 国产精品成人国产|