最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Tomcat ClassLoader打破雙親委派源碼解析

 更新時(shí)間:2023年09月01日 11:31:34   作者:湯卜  
這篇文章主要為大家介紹了Tomcat ClassLoader打破雙親委派源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

java加載類

java加載類的時(shí)候需要使用類加載器,開發(fā)人員可以定制類的加載器,比如tomcat就擴(kuò)展了自己的類加載器。這篇文章結(jié)合代碼研究一下jdk類的加載器和tomcat的類加載

先上圖復(fù)習(xí)一下

來看一下jdk的ClassLoader的代碼

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 本類加載器從緩存里面拿取已經(jīng)加載過的ClassLoader
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    // 父類為BootStrapClassLoader的classLoader 的parent變量為空
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }
                ..........
    }

注意看一下核心代碼,實(shí)際上parent只要不為空就由parent來加載,因此當(dāng)類未加載的時(shí)候,總是由上級來優(yōu)先加載。

tomcat的類加載

首先來看一下tomcat的類加載器,tomcat寫了一個(gè)自己的類加載器,看下基類WebappClassLoaderBase的實(shí)現(xiàn)

@Override
    public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        synchronized (getClassLoadingLock(name)) {
           ................
            // 從緩存里面取,不影響加載順序,請著重忽略
            clazz = findLoadedClass0(name);
            ..........
            clazz = findLoadedClass(name);
            .........
           /**
     * The bootstrap class loader used to load the JavaSE classes. In some
     * implementations this class loader is always <code>null</code> and in
     * those cases {@link ClassLoader#getParent()} will be called recursively on
     * the system class loader and the last non-null result used.
     */
            // 注意看注釋,javaseLoader是bootstrap加載的,所以javaseLoader是擴(kuò)展類加載器
            ClassLoader javaseLoader = getJavaseClassLoader();
            clazz = javaseLoader.loadClass(name);
            boolean delegateLoad = delegate || filter(name, true);
            // (2) Search local repositories
            if (log.isDebugEnabled()) {
                log.debug("  Searching local repositories");
            }
            try {
            // 重寫了findClass方法,從項(xiàng)目中的lib和class里加載
                clazz = findClass(name);
                if (clazz != null) {
                    if (log.isDebugEnabled()) {
                        log.debug("  Loading class from local repository");
                    }
                    if (resolve) {
                        resolveClass(clazz);
                    }
                    return clazz;
                }
            } catch (ClassNotFoundException e) {
                // Ignore
            }
            // (3) Delegate to parent unconditionally
            if (!delegateLoad) {
                if (log.isDebugEnabled()) {
                    log.debug("  Delegating to parent classloader at end: " + parent);
                }
                try {
//  繼承于SystemClassLoader該類,所以這個(gè)parent是SystemClassLoader,
                    clazz = Class.forName(name, false, parent);
                    if (clazz != null) {
                        if (log.isDebugEnabled()) {
                            log.debug("  Loading class from parent");
                        }
                        if (resolve) {
                            resolveClass(clazz);
                        }
                        return clazz;
                    }
                } catch (ClassNotFoundException e) {
                    // Ignore
                }
            }
        }
        throw new ClassNotFoundException(name);
    }

把順序相關(guān)外的代碼省略了,注意看注釋。

因此來梳理一下加載順序

1.找ext加載器,ext會優(yōu)先走BootStrap加載器,加載java核心類庫

2.ext加載不到就去走重寫的findClass,走web項(xiàng)目的lib包和class目錄,加載項(xiàng)目的class

3.重寫的findClass找不到,就去系統(tǒng)類加載器SystemClassLoader來加載。

tomcat為什么要重寫這個(gè)ClassLoader呢

1.最重要的就是做隔離性,不同的 web包引入不同的jar包版本,如果重寫類的加載順序,統(tǒng)一走SystemClassloader加載,那么只會加載一個(gè)類在內(nèi)存,另外一個(gè)版本的class永遠(yuǎn)也不會加載進(jìn)內(nèi)存。無法實(shí)現(xiàn)web項(xiàng)目的隔離

2.可以針對一個(gè)應(yīng)用進(jìn)行重新部署,一個(gè)應(yīng)用一個(gè)加載器,需要重新部署,就把這個(gè)classLoader加載的類重新加載就可以了

所以看起來打破雙親委派這種大名頭的知識,看一下源碼就清晰了,養(yǎng)成閱讀源碼習(xí)慣就可以

以上就是Tomcat ClassLoader打破雙親委派源碼解析的詳細(xì)內(nèi)容,更多關(guān)于Tomcat ClassLoader雙親委派的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)

    Java 添加、刪除、替換、格式化Word中的文本的步驟詳解(基于Spire.Cloud.SDK for Java)

    這篇文章主要介紹了Java 添加、刪除、替換、格式化Word中的文本(基于Spire.Cloud.SDK for Java),本文分步驟通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java中JSON字符串與java對象的互換實(shí)例詳解

    Java中JSON字符串與java對象的互換實(shí)例詳解

    這篇文章主要介紹了在java中,JSON字符串與java對象的相互轉(zhuǎn)換實(shí)例詳解,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-08-08
  • Spring Cloud Consul的服務(wù)注冊與發(fā)現(xiàn)

    Spring Cloud Consul的服務(wù)注冊與發(fā)現(xiàn)

    這篇文章主要介紹了Spring Cloud Consul服務(wù)注冊與發(fā)現(xiàn)的實(shí)現(xiàn)方法,幫助大家更好的理解和學(xué)習(xí)使用spring框架,感興趣的朋友可以了解下
    2021-02-02
  • Java中String使用方法及分析(UTF-8簡單編碼/解碼器實(shí)現(xiàn))

    Java中String使用方法及分析(UTF-8簡單編碼/解碼器實(shí)現(xiàn))

    在Java中String類是用來表示和操作字符串的,它是Java中最常用的類之一,提供了豐富的方法來創(chuàng)建、操作和查詢字符串,這篇文章主要介紹了Java中String使用方法及分析(UTF-8簡單編碼/解碼器實(shí)現(xiàn))的相關(guān)資料,需要的朋友可以參考下
    2025-12-12
  • 詳解Java從工廠方法模式到 IOC/DI思想

    詳解Java從工廠方法模式到 IOC/DI思想

    工廠方法(Factory Method)模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口。本文將詳細(xì)介紹Java從工廠方法模式到 IOC/DI思想。
    2021-06-06
  • 基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng)

    基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了基于UDP協(xié)議實(shí)現(xiàn)聊天系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • JAVA讀取文本文件內(nèi)容實(shí)例代碼

    JAVA讀取文本文件內(nèi)容實(shí)例代碼

    這篇文章主要給大家介紹了關(guān)于JAVA讀取文本文件內(nèi)容的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 關(guān)于SpringBoot攔截器攔截靜態(tài)資源的問題

    關(guān)于SpringBoot攔截器攔截靜態(tài)資源的問題

    這篇文章主要介紹了關(guān)于SpringBoot攔截器攔截靜態(tài)資源的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • SpringBoot?整合Mybatis-Plus并輸出SQL日志示例詳解

    SpringBoot?整合Mybatis-Plus并輸出SQL日志示例詳解

    這篇文章主要介紹了SpringBoot整合Mybatis-Plus并輸出SQL日志,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Spring中XmlWebApplicationContext的實(shí)現(xiàn)

    Spring中XmlWebApplicationContext的實(shí)現(xiàn)

    XmlWebApplicationContext是Spring?Framework中的一個(gè)重要類,本文主要介紹了Spring中XmlWebApplicationContext,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-08-08

最新評論

涿鹿县| 兴城市| 通城县| 新民市| 龙游县| 惠水县| 福安市| 微博| 通海县| 三门县| 石泉县| 万年县| 滦平县| 五寨县| 岳西县| 武汉市| 四会市| 娄烦县| 永济市| 英超| 顺平县| 囊谦县| 棋牌| 五常市| 房山区| 鲁甸县| 武城县| 宜黄县| 浮山县| 昌吉市| 屏边| 盐城市| 比如县| 萝北县| 革吉县| 文成县| 西畴县| 砀山县| 河池市| 武夷山市| 栾城县|