aop代理方式引起的spring注入bean(實現類)與獲取bean(實現類)出錯


描述:

  現象一 :A 為 接口,AImpl 為 A 的實現類,且 AImpl 受 aop 掃描,且 aop 無特殊配置

       此時若:Spring 中 注入 AImpl 類型的bean,獲取一樣     報錯

         Spring 中 注入 A 類型的bean ,獲取一樣          成功

  現象二 :B 沒有實現接口,B受 aop 掃描,且 aop無特殊配置

       此時若:Spring 中 注入 B 類型的bean,獲取一樣           成功

分析:

  1、如果目標對象實現了接口,默認情況下會采用JDK的動態代理實現AOP 
  2、如果目標對象實現了接口,可以強制使用CGLIB實現AOP 
  3、如果目標對象沒有實現了接口,必須采用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間轉換

  現象一 :因為 AImpl 實現了 A 接口,所有自動使用了JDK proxy ,而JDK proxy 實現原理基於接口生成代理對象(詳見下邊鏈接)

       代理對象 類型不同於 AImpl ,所以報錯

       JDK proxy 生成的代理對象也實現了A 接口,so  接口類型可以。

  現象二 :B 沒有實現接口,故spring 采用 cglib 實現動態代理,其原理是生成子類(詳見下邊鏈接)

       so , 成功注入與獲取。

解決:

   Spring 中添加配置  <aop:aspectj-autoproxy proxy-target-class="true"/>

 

參考:

   http://fuhuijun.iteye.com/blog/2253741

   JDK動態代理和CGLIB代理的區別

   Spring中AOP的兩種代理方式(Java動態代理和CGLIB代理)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM