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

springboot2.x默認使用的代理是cglib代理操作

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

背景

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

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

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

驗證

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項目的方法是先獲取目標類,然后再通過目標類獲取目標方法,然后再獲取方法上的注解。

深度追蹤

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

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

先關issue如下:

issue1

issue2

issue2

springboot團隊之所以默認的代理模式設置成cglib代理,看看spring的官方團隊是怎么解釋的

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

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

/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
    },

如果在事務中強制使用JDK動態(tài)代理,以往的知識告訴我們,我們需要將proxyTargetClass 設置成false,于是我們在springboot 中發(fā)現(xiàn)注解@EnableTransactionManagement 或者@EnableAspectJAutoProxy默認就為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)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Spring Boot使用RestTemplate消費REST服務的幾個問題記錄

    Spring Boot使用RestTemplate消費REST服務的幾個問題記錄

    這篇文章主要介紹了Spring Boot使用RestTemplate消費REST服務的幾個問題記錄,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-06-06
  • Java Http請求傳json數(shù)據(jù)亂碼問題的解決

    Java Http請求傳json數(shù)據(jù)亂碼問題的解決

    這篇文章主要介紹了Java Http請求傳json數(shù)據(jù)亂碼問題的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • JAVA實現(xiàn)的簡單萬年歷代碼

    JAVA實現(xiàn)的簡單萬年歷代碼

    這篇文章主要介紹了JAVA實現(xiàn)的簡單萬年歷代碼,涉及Java日期操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • java中springMVC獲取請求參數(shù)的方法

    java中springMVC獲取請求參數(shù)的方法

    這篇文章主要介紹了java中springMVC獲取請求參數(shù)的方法,springmvc是spring框架的一個模塊,springmvc和spring無需通過中間整合層進行整合,需要的朋友可以參考下
    2023-05-05
  • 解決IDEA中下載free maven plugin插件無效的問題

    解決IDEA中下載free maven plugin插件無效的問題

    這篇文章主要介紹了解決IDEA中下載free maven plugin插件無效的問題,本文通過圖文并茂的形式給大家分享解決方案,供大家參考,需要的朋友可以參考下
    2020-11-11
  • Java ThreadLocal詳解_動力節(jié)點Java學院整理

    Java ThreadLocal詳解_動力節(jié)點Java學院整理

    ThreadLocal,很多地方叫做線程本地變量,也有些地方叫做線程本地存儲,本文會詳細的介紹一下,有興趣的可以了解一下
    2017-06-06
  • Spring?Boot項目如何優(yōu)雅實現(xiàn)Excel導入與導出功能

    Spring?Boot項目如何優(yōu)雅實現(xiàn)Excel導入與導出功能

    在我們平時工作中經(jīng)常會遇到要操作Excel的功能,比如導出個用戶信息或者訂單信息的Excel報表,下面這篇文章主要給大家介紹了關于Spring?Boot項目中如何優(yōu)雅實現(xiàn)Excel導入與導出功能的相關資料,需要的朋友可以參考下
    2022-06-06
  • MyBatisPlus的IService接口實現(xiàn)

    MyBatisPlus的IService接口實現(xiàn)

    MyBatisPlus是一個為MyBatis提供增強的工具,它通過IService接口簡化了數(shù)據(jù)庫的CRUD操作,IService接口封裝了一系列常用的數(shù)據(jù)操作方法,本文就來介紹一下,感興趣的可以了解一下
    2024-10-10
  • Spring Cloud入門系列服務提供者總結

    Spring Cloud入門系列服務提供者總結

    這篇文章主要介紹了Spring Cloud入門系列之服務提供者總結,服務提供者使用Eureka Client組件創(chuàng)建 ,創(chuàng)建完成以后修改某文件,具體操作方法及實例代碼跟隨小編一起看看吧
    2021-06-06
  • MybatisPlus字段自動填充失效,填充值為null的解決方案

    MybatisPlus字段自動填充失效,填充值為null的解決方案

    這篇文章主要介紹了MybatisPlus字段自動填充失效,填充值為null的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論