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

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

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

java加載類(lèi)

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

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

來(lái)看一下jdk的ClassLoader的代碼

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // 本類(lèi)加載器從緩存里面拿取已經(jīng)加載過(guò)的ClassLoader
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    // 父類(lèi)為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來(lái)加載,因此當(dāng)類(lèi)未加載的時(shí)候,總是由上級(jí)來(lái)優(yōu)先加載。

tomcat的類(lèi)加載

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

@Override
    public Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        synchronized (getClassLoadingLock(name)) {
           ................
            // 從緩存里面取,不影響加載順序,請(qǐng)著重忽略
            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.
     */
            // 注意看注釋?zhuān)琷avaseLoader是bootstrap加載的,所以javaseLoader是擴(kuò)展類(lèi)加載器
            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 {
            // 重寫(xiě)了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該類(lèi),所以這個(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)外的代碼省略了,注意看注釋。

因此來(lái)梳理一下加載順序

1.找ext加載器,ext會(huì)優(yōu)先走BootStrap加載器,加載java核心類(lèi)庫(kù)

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

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

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

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

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

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

以上就是Tomcat ClassLoader打破雙親委派源碼解析的詳細(xì)內(nèi)容,更多關(guān)于Tomcat ClassLoader雙親委派的資料請(qǐng)關(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),本文分步驟通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java中JSON字符串與java對(duì)象的互換實(shí)例詳解

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

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

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

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

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

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

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

    工廠方法(Factory Method)模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類(lèi)當(dāng)中。核心工廠類(lèi)不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類(lèi)成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類(lèi)必須實(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)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 關(guān)于SpringBoot攔截器攔截靜態(tài)資源的問(wèn)題

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

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

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

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

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

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

最新評(píng)論

定远县| 城市| 江门市| 车致| 信宜市| 锡林浩特市| 平阴县| 大兴区| 郓城县| 象山县| 和平县| 五原县| 洛川县| 郁南县| 郯城县| 巍山| 阜平县| 本溪| 汉源县| 武冈市| 阿合奇县| 安乡县| 扶风县| 东乌珠穆沁旗| 墨玉县| 徐汇区| 固阳县| 临沭县| 繁昌县| 浦江县| 东台市| 遂溪县| 北安市| 张家口市| 镇雄县| 塔城市| 板桥市| 乌鲁木齐县| 三亚市| 南江县| 温泉县|