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

Java中Cglib代理和JDK代理的區(qū)別詳解

 更新時(shí)間:2023年09月20日 08:52:36   作者:信仰_273993243  
這篇文章主要介紹了Java中Cglib代理和JDK代理的區(qū)別詳解,Cglib代理功能更強(qiáng),無(wú)論目標(biāo)類(lèi)是否實(shí)現(xiàn)了接口都可以代理,他是基于繼承的方式來(lái)代理目標(biāo)類(lèi),如果目標(biāo)類(lèi)也實(shí)現(xiàn)了接口,代理類(lèi)也會(huì)實(shí)現(xiàn)一次,需要的朋友可以參考下

一、JDK

Jdk動(dòng)態(tài)代理,拿到目標(biāo)類(lèi)所實(shí)現(xiàn)的接口(目標(biāo)類(lèi)必須有實(shí)現(xiàn)接口),生成代理類(lèi),并且代理類(lèi)也會(huì)實(shí)現(xiàn)和目標(biāo)類(lèi)一樣的接口。

二、Cglib

Cglib代理功能更強(qiáng),無(wú)論目標(biāo)類(lèi)是否實(shí)現(xiàn)了接口都可以代理,他是基于繼承的方式來(lái)代理目標(biāo)類(lèi),如果目標(biāo)類(lèi)也實(shí)現(xiàn)了接口,代理類(lèi)也會(huì)實(shí)現(xiàn)一次

public Object getProxy(@Nullable ClassLoader classLoader) {
		Class<?> rootClass = this.advised.getTargetClass();//目標(biāo)類(lèi)
        Class<?> proxySuperClass = rootClass;
        if (rootClass.getName().contains("$$")) { //如果目標(biāo)類(lèi)也是一個(gè)代理類(lèi),那么就拿到這個(gè)代理類(lèi)的父類(lèi),因?yàn)檫@個(gè)代理類(lèi)的父類(lèi),才是我們真正要代理的目標(biāo)類(lèi)。然后繼承他
            proxySuperClass = rootClass.getSuperclass();
            Class<?>[] additionalInterfaces = rootClass.getInterfaces();//如果目標(biāo)類(lèi)是一個(gè)代理類(lèi),那么這個(gè)代理實(shí)現(xiàn)的接口,也就是新的代理類(lèi)要實(shí)現(xiàn)的接口。
            this.advised.addInterface(additionalInterfaces); 把接口存起來(lái)下面要用
        }
        Enhancer enhancer = this.createEnhancer();
        enhancer.setSuperclass(proxySuperClass);  //設(shè)置代理的父類(lèi),可能是目標(biāo)類(lèi)的類(lèi)型,可能是目標(biāo)類(lèi)的父類(lèi)。
        enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised));  //設(shè)置新的代理類(lèi)要實(shí)現(xiàn)的接口。
        //必實(shí)現(xiàn)的接口SpringProxy,如果是切面還會(huì)實(shí)現(xiàn)Advised
        enhancer.setNamingPolicy(SpringNamingPolicy.INSTANCE);
        enhancer.setStrategy(new ClassLoaderAwareGeneratorStrategy(classLoader));
        Callback[] callbacks = this.getCallbacks(rootClass);
        Class<?>[] types = new Class[callbacks.length];
        。。。。。
}

三、如何選擇

那么在Spring創(chuàng)建代理對(duì)象的時(shí)候是選擇Cglib還是Jdk有一段代碼

//判斷是否是接口或者是否是代理類(lèi)
if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
    new JdkDynamicAopProxy(config)
} else {
    new ObjenesisCglibAopProxy(config)
}
public static boolean isProxyClass(Class<?> cl) {
    return Proxy.class.isAssignableFrom(cl) && proxyClassCache.containsValue(cl);
}

Proxy.class.isAssignableFrom(cl)就是判斷cl所表示的類(lèi)是不是SpringProxy或者SpringProxy的子類(lèi)。因?yàn)樗械拇眍?lèi)都會(huì)繼承SpringProxy,所以這個(gè)條件必須滿(mǎn)足。滿(mǎn)足這個(gè)條件也不能保證就是代理類(lèi),因?yàn)榭赡艽嬖谌藶榈鼐帉?xiě)一個(gè)類(lèi)繼承SpringProxy。proxyClassCache.containsValue(cl)這個(gè)方法是檢查緩存中是否存在這個(gè)Class實(shí)例cl。只要生成過(guò)代理類(lèi)都會(huì)被緩存,所以這個(gè)方法才是檢測(cè)一個(gè)類(lèi)是否是代理類(lèi)的唯一標(biāo)準(zhǔn)。

到此這篇關(guān)于Java中Cglib代理和JDK代理的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Cglib代理和JDK代理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • IDEA如何對(duì)多線(xiàn)程進(jìn)行debug的示例詳解

    IDEA如何對(duì)多線(xiàn)程進(jìn)行debug的示例詳解

    開(kāi)發(fā)中使用到多線(xiàn)程的時(shí)候不少,但是debug起來(lái)還是比較困難的,因?yàn)槟J(rèn)每次只會(huì)進(jìn)入一個(gè)線(xiàn)程,這樣有些問(wèn)題是發(fā)現(xiàn)不了的,其實(shí)IDEA也是支持進(jìn)入每個(gè)線(xiàn)程來(lái)debug的,本文給大家介紹了IDEA如何對(duì)多線(xiàn)程進(jìn)行debug的示例,需要的朋友可以參考下
    2024-05-05
  • Java加密解密和數(shù)字簽名完整代碼示例

    Java加密解密和數(shù)字簽名完整代碼示例

    這篇文章主要介紹了Java加密解密和數(shù)字簽名完整代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-12-12
  • Java8 Comparator源碼演示及解析

    Java8 Comparator源碼演示及解析

    這篇文章主要介紹了Java8 Comparator源碼演示及解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-11-11
  • 教你用java完美封裝微信模板消息的發(fā)送動(dòng)態(tài)

    教你用java完美封裝微信模板消息的發(fā)送動(dòng)態(tài)

    這篇文章主要介紹了教你用java完美封裝微信模板消息的發(fā)送動(dòng)態(tài),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-04-04
  • SVN導(dǎo)入maven項(xiàng)目報(bào)錯(cuò)解決方案

    SVN導(dǎo)入maven項(xiàng)目報(bào)錯(cuò)解決方案

    這篇文章主要介紹了SVN導(dǎo)入maven項(xiàng)目報(bào)錯(cuò)解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-12-12
  • Java之Optional類(lèi)判空使用及說(shuō)明

    Java之Optional類(lèi)判空使用及說(shuō)明

    這篇文章主要介紹了Java之Optional類(lèi)判空使用及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2026-06-06
  • Java多線(xiàn)程案例之阻塞隊(duì)列詳解

    Java多線(xiàn)程案例之阻塞隊(duì)列詳解

    阻塞隊(duì)列是一種特殊的隊(duì)列.?也遵守?“先進(jìn)先出”?的原則.阻塞隊(duì)列能是一種線(xiàn)程安全的數(shù)據(jù)結(jié)構(gòu)。本文將通過(guò)一些示例為大家詳細(xì)講講阻塞隊(duì)列的原理與使用,感興趣的小伙伴可以學(xué)習(xí)一下
    2022-10-10
  • Java Synchronized字節(jié)碼層分析體驗(yàn)

    Java Synchronized字節(jié)碼層分析體驗(yàn)

    這篇文章主要介紹了Java Synchronized字節(jié)碼層分析,synchronized關(guān)鍵字解決了多個(gè)線(xiàn)程之間的資源同步性,synchronized關(guān)鍵字保證了它修飾的方法或者代碼塊任意時(shí)刻只有一個(gè)線(xiàn)程在訪(fǎng)問(wèn)
    2023-04-04
  • Java用文件流下載網(wǎng)絡(luò)文件示例代碼

    Java用文件流下載網(wǎng)絡(luò)文件示例代碼

    這篇文章主要介紹了Java用文件流的方式下載網(wǎng)絡(luò)文件,大家參考使用吧
    2013-11-11
  • SpringBoot項(xiàng)目中處理返回json的null值(springboot項(xiàng)目為例)

    SpringBoot項(xiàng)目中處理返回json的null值(springboot項(xiàng)目為例)

    本文以spring boot項(xiàng)目為例給大家介紹SpringBoot項(xiàng)目中處理返回json的null值問(wèn)題,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下
    2019-10-10

最新評(píng)論

会泽县| 巴东县| 醴陵市| 澎湖县| 邹平县| 松溪县| 赣榆县| 樟树市| 磐安县| 容城县| 永昌县| 明溪县| 墨竹工卡县| 饶河县| 息烽县| 准格尔旗| 交口县| 子长县| 老河口市| 托克逊县| 蒙自县| 巴彦淖尔市| 石屏县| 萝北县| 电白县| 云南省| 惠水县| 会东县| 永寿县| 普格县| 奉节县| 阳信县| 聊城市| 蒙城县| 黄平县| 博爱县| 新乡县| 杭锦后旗| 通州区| 天全县| 泰来县|