描述:
現象一 :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
Spring中AOP的兩種代理方式(Java動態代理和CGLIB代理)