<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ### Tomcat類加載器層次 Tomcat 作為`Servlet`容器,它負責加載我們的`Servlet`類,此外它還負責加載`Servlet`所依賴的 JAR 包。并且`Tomcat`本身也是也是一個 Java 程序,因此它需要加載自己的類和依賴的 JAR 包。首先讓我們思考這一下這幾個問題: 1. 假如我們在 Tomcat 中運行了兩個 Web 應用程序,兩個 Web 應用中有同名的`Servlet`,但是功能不同,Tomcat 需要同時加載和管理這兩個同名的`Servlet`類,保證它們不會沖突,因此 Web 應用之間的類需要隔離。 2. 假如兩個 Web 應用都依賴同一個第三方的 JAR 包,比如`Spring`,那`Spring`的 JAR 包被加載到內存后,`Tomcat`要保證這兩個 Web 應用能夠共享,也就是說`Spring`的 JAR 包只被加載一次,否則隨著依賴的第三方 JAR 包增多,`JVM`的內存會膨脹。 3. 跟 JVM 一樣,我們需要隔離 Tomcat 本身的類和 Web 應用的類 ![](https://img.kancloud.cn/e0/9b/e09b5de9b96e4fb1be65fe5fce5c2aa9_569x485.png) 具體介紹下: * **CommonClassLoader**:以應用類加載器為父類,是tomcat頂層的公用類加載器,其路徑由conf/catalina.properties中的common.loader指定,默認指向${catalina.home}/lib下的包。 * **CatalinaClassloader**:以Common類加載器為父類,是用于加載Tomcat應用服務器的類加載器,其路徑由server.loader指定,默認為空,此時tomcat使用Common類加載器加載應用服務器。 * **SharedClassLoader**:以Common類加載器為父類,是所有Web應用的父類加載器,其路徑由shared.loader指定,默認為空,此時tomcat使用Common類加載器作為Web應用的父加載器。本質需求是兩個 Web 應用之間怎么共享庫類,并且不能重復加載相同的類。在雙親委托機制里,各個子加載器都可以通過父加載器去加載類,那么把需要共享的類放到父加載器的加載路徑下不就行了嗎。 因此 Tomcat 的設計者又加了一個類加載器`SharedClassLoader`,作為`WebAppClassLoader`的父加載器,專門來加載 Web 應用之間共享的類。如果`WebAppClassLoader`自己沒有加載到某個類,就會委托父加載器`SharedClassLoader`去加載這個類,`SharedClassLoader`會在指定目錄下加載共享類,之后返回給`WebAppClassLoader`,例如多個web應用都依賴的spring就可以使用SharedClassLoader進行加載; * **WebAppClassLoader**:以Shared類加載器為父類,加載/WEB-INF/classes目錄下的未壓縮的Class和資源文件以及/WEB-INF/lib目錄下的jar包,該類加載器只對當前Web應用可見,對其他Web應用均不可見;Tomcat 的解決方案是自定義一個類加載器`WebAppClassLoader`, 并且給每個 Web 應用創建一個類加載器實例。我們知道,Context 容器組件對應一個 Web 應用,因此,每個`Context`容器負責創建和維護一個`WebAppClassLoader`加載器實例。這背后的原理是,**不同的加載器實例加載的類被認為是不同的類**,即使它們的類名相同。這就相當于在 Java 虛擬機內部創建了一個個相互隔離的 Java 類空間,每一個 Web 應用都有自己的類空間,Web 應用之間通過各自的類加載器互相隔離。 #### 如何隔離 Tomcat 本身的類和 Web 應用的類? 要共享可以通過父子關系,要隔離那就需要兄弟關系了。兄弟關系就是指兩個類加載器是平行的,它們可能擁有同一個父加載器,基于此 Tomcat 又設計一個類加載器`CatalinaClassloader`,專門來加載 Tomcat 自身的類。 這樣設計有個問題,那 Tomcat 和各 Web 應用之間需要共享一些類時該怎么辦呢? 老辦法,還是再增加一個`CommonClassLoader`,作為`CatalinaClassloader`和`SharedClassLoader`的父加載器。`CommonClassLoader`能加載的類都可以被`CatalinaClassLoader`和`SharedClassLoader`使用 ***** 默認情況下,Common、Catalina、Shared類加載器是同一個,但可以配置3個不同的類加載器,使他們各司其職 > Common類加載器復雜加載Tomcat應用服務器內部和Web應用均可見的類,如Servlet規范相關包和一些通用工具包。 > Catalina類加載器負責只有Tomcat應用服務器內部可見的類,這些類對Web應用不可見。比如,想實現自己的會話存儲方案,而且該方案依賴了一些第三方包,當然是不希望這些包對Web應用可見,這時可以配置server.load,創建獨立的Catalina類加載器。 > Shared類復雜加載Web應用共享類,這些類tomcat服務器不會依賴 ***** Q:如果有10個Web應用程序都是用Spring來進行組織和管理的話,可以把Spring放到Common或Shared目錄下讓這些程序共享。Spring要對用戶程序的類進行管理,自然要能訪問到用戶程序的類,而用戶的程序顯然是放在/WebApp/WEB-INF目錄中的,那么被CommonClassLoader或SharedClassLoader加載的Spring如何訪問并不在其加載范圍內的用戶程序呢? 如果按主流的雙親委派機制,顯然無法做到讓父類加載器加載的類去訪問子類加載器加載的類,但使用線程上下文加載器,可以讓父類加載器請求子類加載器去完成類加載的動作。spring加載類所用的Classloader是通過Thread.currentThread().getContextClassLoader()來獲取的,而當線程創建時會默認setContextClassLoader(AppClassLoader),即線程上下文類加載器被設置為AppClassLoader,spring中始終可以獲取到這個AppClassLoader(在Tomcat里就是WebAppClassLoader)子類加載器來加載bean,以后任何一個線程都可以通過getContextClassLoader()獲取到WebAppClassLoader來getbean了
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看