欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

一、JDK

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

二、Cglib

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

public Object getProxy(@Nullable ClassLoader classLoader) {
		Class<?> rootClass = this.advised.getTargetClass();//目標(biāo)類
        Class<?> proxySuperClass = rootClass;
        if (rootClass.getName().contains("$$")) { //如果目標(biāo)類也是一個(gè)代理類,那么就拿到這個(gè)代理類的父類,因?yàn)檫@個(gè)代理類的父類,才是我們真正要代理的目標(biāo)類。然后繼承他
            proxySuperClass = rootClass.getSuperclass();
            Class<?>[] additionalInterfaces = rootClass.getInterfaces();//如果目標(biāo)類是一個(gè)代理類,那么這個(gè)代理實(shí)現(xiàn)的接口,也就是新的代理類要實(shí)現(xiàn)的接口。
            this.advised.addInterface(additionalInterfaces); 把接口存起來(lái)下面要用
        }
        Enhancer enhancer = this.createEnhancer();
        enhancer.setSuperclass(proxySuperClass);  //設(shè)置代理的父類,可能是目標(biāo)類的類型,可能是目標(biāo)類的父類。
        enhancer.setInterfaces(AopProxyUtils.completeProxiedInterfaces(this.advised));  //設(shè)置新的代理類要實(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有一段代碼

//判斷是否是接口或者是否是代理類
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所表示的類是不是SpringProxy或者SpringProxy的子類。因?yàn)樗械拇眍惗紩?huì)繼承SpringProxy,所以這個(gè)條件必須滿足。滿足這個(gè)條件也不能保證就是代理類,因?yàn)榭赡艽嬖谌藶榈鼐帉懸粋€(gè)類繼承SpringProxy。proxyClassCache.containsValue(cl)這個(gè)方法是檢查緩存中是否存在這個(gè)Class實(shí)例cl。只要生成過(guò)代理類都會(huì)被緩存,所以這個(gè)方法才是檢測(cè)一個(gè)類是否是代理類的唯一標(biāo)準(zhǔn)。

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

相關(guān)文章

  • SpringBoot實(shí)現(xiàn)Read Through模式的操作過(guò)程

    SpringBoot實(shí)現(xiàn)Read Through模式的操作過(guò)程

    Read Through模式通常是指一種緩存策略,其中當(dāng)應(yīng)用程序嘗試讀取數(shù)據(jù)時(shí),緩存系統(tǒng)首先被檢查以查看數(shù)據(jù)是否已經(jīng)存在于緩存中,這篇文章主要介紹了SpringBoot實(shí)現(xiàn)Read Through模式,需要的朋友可以參考下
    2024-07-07
  • mybatis-plus樂(lè)觀鎖實(shí)現(xiàn)方式詳解

    mybatis-plus樂(lè)觀鎖實(shí)現(xiàn)方式詳解

    這篇文章主要介紹了mybatis-plus樂(lè)觀鎖實(shí)現(xiàn)方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-01-01
  • Request對(duì)象如何獲取請(qǐng)求頭數(shù)據(jù)

    Request對(duì)象如何獲取請(qǐng)求頭數(shù)據(jù)

    這篇文章主要介紹了Request對(duì)象如何獲取請(qǐng)求頭數(shù)據(jù)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • IDEA中查看類繼承圖和類源碼的騷操作

    IDEA中查看類繼承圖和類源碼的騷操作

    這篇文章主要介紹了IDEA中查看類繼承圖和類源碼的騷操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • IntelliJ IDEA右鍵文件夾沒(méi)有Java Class文件的原因及解決方法

    IntelliJ IDEA右鍵文件夾沒(méi)有Java Class文件的原因及解決方法

    這篇文章主要介紹了IntelliJ IDEA右鍵文件夾沒(méi)有Java Class文件的原因及解決方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Java常用字符串方法小結(jié)

    Java常用字符串方法小結(jié)

    字符串變量是Java與C語(yǔ)言的一大不同之處。Java之中的 String 類和 Stringbuffer 類提供了大量的對(duì)字符串操作的方法。String 類適合處理較小的字符串,而Stringbuffer類適合處理大量字符串
    2017-04-04
  • java獲得平臺(tái)相關(guān)的行分隔符和java路徑分隔符的方法

    java獲得平臺(tái)相關(guān)的行分隔符和java路徑分隔符的方法

    不同系統(tǒng)平臺(tái)下的行分隔符、路徑分隔符等常常不同,如何在Java程序獲取當(dāng)前平臺(tái)的分隔符,以及其他系統(tǒng)相關(guān)的狀態(tài)呢?下面是示例程序,需要的朋友可以參考下
    2014-02-02
  • SpringBoot集成ShardingSphere實(shí)現(xiàn)數(shù)據(jù)庫(kù)分表

    SpringBoot集成ShardingSphere實(shí)現(xiàn)數(shù)據(jù)庫(kù)分表

    ShardingSphere?是一個(gè)開源的分布式數(shù)據(jù)庫(kù)中間件,旨在為應(yīng)用提供數(shù)據(jù)庫(kù)分片、讀寫分離、分布式事務(wù)等功能,下面我們來(lái)看看SpringBoot如何集成ShardingSphere實(shí)現(xiàn)數(shù)據(jù)庫(kù)分表吧
    2024-12-12
  • Java實(shí)現(xiàn)解壓zip壓縮包的兩種方法(支持多層級(jí))

    Java實(shí)現(xiàn)解壓zip壓縮包的兩種方法(支持多層級(jí))

    壓縮文件在生活中經(jīng)常能用到,在Java中提供了壓縮和解壓縮文件的功能,本文主要介紹了Java實(shí)現(xiàn)解壓zip壓縮包的兩種方法(支持多層級(jí)),感興趣的可以了解一下
    2024-03-03
  • 深入理解Spring中的循環(huán)依賴

    深入理解Spring中的循環(huán)依賴

    Spring在注入bean的時(shí)候會(huì)做循環(huán)依賴檢查,下面這篇文章主要給大家介紹了關(guān)于Spring中循環(huán)依賴的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧
    2018-05-05

最新評(píng)論