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

springboot2.x默認(rèn)使用的代理是cglib代理操作

 更新時間:2021年08月09日 09:51:27   作者:淘氣小子  
這篇文章主要介紹了springboot2.x默認(rèn)使用的代理是cglib代理操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

背景

因為項目優(yōu)化,打算寫個日志的切面類,于是起了個springboot 工程,在這里面測試。結(jié)果在springboot 里面測試正常,能正確打印日志,但是把代碼復(fù)制到實際項目中,在進(jìn)入切面打印日志的時候總是報錯,報空指針錯誤。

經(jīng)調(diào)試發(fā)現(xiàn)每次都是在獲取注解上的屬性時報錯。當(dāng)時百思不得解。后來靈光一閃,想到可能是項目中獲取到的是接口方法,而springboot是實現(xiàn)類的method ,所以可以拿到注解的屬性。

但是仔細(xì)一想,Springboot里面也是接口,難道不應(yīng)該走JDK動態(tài)代理嗎?那拿到這個方法的應(yīng)該也是接口的方法,帶著這個疑問,我開始了我的探索之旅。

驗證

springboot 項目

cglib動態(tài)代理

spring 項目

JDK動態(tài)代理

發(fā)現(xiàn)springBoot 竟然走的是cglib代理,起代理的是實現(xiàn)類,所以能拿到方法上注解的屬性,而我的項目是個傳統(tǒng)的spring 項目,service是接口,走的是JDK動態(tài)代理,通過切點拿到的是接口的方法,而接口上又沒有注解,所以按照springboot的寫法是拿不到注解的,拿不到注解也就拿不到注解屬性,所以報錯。

解決辦法

springboot的寫法

 private Method getMethod(ProceedingJoinPoint joinPoint) throws NoSuchMethodException {
        //獲取方法簽名
        Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
        return method;
    }
    
 private String getAnnotationDesc(ProceedingJoinPoint joinPoint) throws NoSuchMethodException {
        Method method = getMethod(joinPoint);
        String value = method.getAnnotation(MyLog.class).value();
        return value;
    }

spring 的寫法

private Method getMethod(ProceedingJoinPoint joinPoint) throws NoSuchMethodException {
        //獲取方法簽名
        Class<?> targetClass = joinPoint.getTarget().getClass();
        String methodName = joinPoint.getSignature().getName();
        Class[] parameterTypes = ((MethodSignature) joinPoint.getSignature()).getParameterTypes();
        Method method = targetClass.getMethod(methodName, parameterTypes);
        return method;
    }
private String getAnnotationDesc(ProceedingJoinPoint joinPoint) throws NoSuchMethodException {
        Method method = getMethod(joinPoint);
        String value = method.getAnnotation(MyLog.class).value();
        return value;
    }

可以看到spring項目的方法是先獲取目標(biāo)類,然后再通過目標(biāo)類獲取目標(biāo)方法,然后再獲取方法上的注解。

深度追蹤

springboot 為什么將默認(rèn)的代理改成了cglib,這會導(dǎo)致什么問題?如果我們想要事務(wù)走JDK動態(tài)代理,該如何做?

帶著這些疑問,我翻閱了springboot的相關(guān)issue ,發(fā)現(xiàn)很多人提這個問題。

先關(guān)issue如下:

issue1

issue2

issue2

springboot團(tuán)隊之所以默認(rèn)的代理模式設(shè)置成cglib代理,看看spring的官方團(tuán)隊是怎么解釋的

This was changed in 1.4 (see 5423). We've generally found cglib proxies less likely to cause unexpected cast exceptions.

他們認(rèn)為使用cglib更不容易出現(xiàn)轉(zhuǎn)換錯誤。springboot 默認(rèn)的配置文件的位置在

/org/springframework/boot/spring-boot-autoconfigure/2.1.7.RELEASE/spring-boot-autoconfigure-2.1.7.RELEASE.jar!/META-INF/spring-configuration-metadata.json

{
      "name": "spring.aop.proxy-target-class",
      "type": "java.lang.Boolean",
      "description": "Whether subclass-based (CGLIB) proxies are to be created (true), as opposed to standard Java interface-based proxies (false).",
      "defaultValue": true
    },

如果在事務(wù)中強制使用JDK動態(tài)代理,以往的知識告訴我們,我們需要將proxyTargetClass 設(shè)置成false,于是我們在springboot 中發(fā)現(xiàn)注解@EnableTransactionManagement 或者@EnableAspectJAutoProxy默認(rèn)就為false,說明這里面的屬性不起作用

@EnableAspectJAutoProxy(proxyTargetClass = false)
@EnableTransactionManagement(proxyTargetClass = false)

同理 @EnableCaching 上的proxyTargetClass 屬性也是失效的。如果偏要springboot 走JDK動態(tài)代理,那么需要在application.properties里面配置

spring.aop.proxy-target-class=false

此時項目中走的就是JDK動態(tài)代理。

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java Date時間類型的操作實現(xiàn)

    Java Date時間類型的操作實現(xiàn)

    本文主要介紹Java Date 日期類型,以及Calendar的怎么獲取時間,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • Kafka利用Java實現(xiàn)數(shù)據(jù)的生產(chǎn)和消費實例教程

    Kafka利用Java實現(xiàn)數(shù)據(jù)的生產(chǎn)和消費實例教程

    這篇文章主要給大家介紹了關(guān)于Kafka利用Java實現(xiàn)數(shù)據(jù)的生產(chǎn)和消費的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01
  • Java依賴包漏洞檢測命令詳解

    Java依賴包漏洞檢測命令詳解

    這篇文章主要介紹了Java依賴包漏洞檢測命令,你可以在修復(fù)漏洞后快速進(jìn)行依賴項的安全檢查,并生成新的報告,而不需要等待 CVE 數(shù)據(jù)庫的下載和更新,這樣可以顯著提高掃描的效率,需要的朋友可以參考下
    2024-11-11
  • Java動態(tài)代理和AOP應(yīng)用示例

    Java動態(tài)代理和AOP應(yīng)用示例

    這篇文章主要介紹了Java動態(tài)代理和AOP應(yīng)用,結(jié)合實例形式分析了java動態(tài)代理在AOP面向切面編程中的相關(guān)操作技巧與使用注意事項,需要的朋友可以參考下
    2019-07-07
  • Java實現(xiàn)時間與字符串互相轉(zhuǎn)換詳解

    Java實現(xiàn)時間與字符串互相轉(zhuǎn)換詳解

    這篇文章主要為大家詳細(xì)介紹了Java中實現(xiàn)時間與字符串互相轉(zhuǎn)換的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2025-04-04
  • java利用反射實現(xiàn)動態(tài)代理示例

    java利用反射實現(xiàn)動態(tài)代理示例

    這篇文章主要介紹了java利用反射實現(xiàn)動態(tài)代理示例,需要的朋友可以參考下
    2014-04-04
  • Java線程本地變量導(dǎo)致的緩存問題解決方法

    Java線程本地變量導(dǎo)致的緩存問題解決方法

    使用緩存可以緩解大流量壓力,顯著提高程序的性能,我們在使用緩存系統(tǒng)時,尤其是大并發(fā)情況下,經(jīng)常會遇到一些疑難雜癥,這篇文章主要給大家介紹了關(guān)于Java線程本地變量導(dǎo)致的緩存問題的解決方法,需要的朋友可以參考下,
    2024-08-08
  • springboot詳解整合swagger方案

    springboot詳解整合swagger方案

    Swagger是一個規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化?Restful?風(fēng)格的?Web?服務(wù)??傮w目標(biāo)是使客戶端和文件系統(tǒng)作為服務(wù)器以同樣的速度來更新。文件的方法、參數(shù)和模型緊密集成到服務(wù)器端的代碼,允許API來始終保持同步
    2022-07-07
  • mybatis定義sql語句標(biāo)簽之delete標(biāo)簽解析

    mybatis定義sql語句標(biāo)簽之delete標(biāo)簽解析

    這篇文章主要介紹了mybatis定義sql語句標(biāo)簽之delete標(biāo)簽解析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • Java并發(fā)編程之詳解CyclicBarrier線程同步

    Java并發(fā)編程之詳解CyclicBarrier線程同步

    在之前的文章中已經(jīng)為大家介紹了java并發(fā)編程的工具:BlockingQueue接口,ArrayBlockingQueue,DelayQueue,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue,BlockingDeque接口,ConcurrentHashMap,CountDownLatch,本文為系列文章第十篇,需要的朋友可以參考下
    2021-06-06

最新評論

蛟河市| 视频| 鹤庆县| 宁都县| 松阳县| 陆丰市| 武穴市| 永安市| 赞皇县| 库伦旗| 兰州市| 留坝县| 巴塘县| 潮州市| 二连浩特市| 四子王旗| 莫力| 嘉黎县| 西平县| 东港市| 峨眉山市| 浦城县| 新宾| 贞丰县| 廊坊市| 类乌齐县| 万盛区| 丹东市| 田林县| 大港区| 旺苍县| 沿河| 郑州市| 加查县| 瑞金市| 安顺市| 碌曲县| 瑞安市| 鄱阳县| 韶关市| 阿坝县|