1. 程式人生 > >配置AOP時報錯:java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to

配置AOP時報錯:java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to

 報錯:

Exception in thread "main" java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to ********

看報錯資訊,顯示的是動態代理生成的類無法轉換到我們自定義的實現類。


原因:業務層實現了介面

 

解決方法方法一:切面配置事務的地方修改成:<aop:config proxy-target-class="true">;即在aop:config標籤中新增 proxy-target-class="true" 即可。

   方法二:加<property name="proxyTargetClass"><value>true</value></property>  沒試過

   方法三:強制轉化成介面



 

  【解釋說明】

  按照部落格的說法:http://blog.csdn.net/z69183787/article/details/17161297

  由於生成代理類有兩種方式:JDK和CGLIB,一種是基於介面的,一種是基於類的。

  如果新增上面的屬性則使用基於類的cglib的方式,相反,如果沒有寫或者是false則通過jdk的基於介面的方式生成代理類。

 

  當然,如果本身不是基於介面的,那麼會自動使用cglib的方式,在這裡很奇怪為什麼沒有自動走cglib的方式。

  箇中緣由,還得去看aop的原始碼,這裡先做下記錄。

 



proxy-target-class 作用

該屬性值預設為false,表示使用JDK動態代理織入增強;當值為true時,表示使用CGLib動態代理織入增強;但是,即使設定為false,如果目標類沒有生命介面,

則Spring將自動使用CGLib動態代理.(以上來自:Spring3.X企業應用開發實戰 P229)

 

通俗理解:

當要使用實現了某個介面的類讓Spring來生成bean時,無需在aop配置中新增proxy-target-class,因為它預設為false.

但如果要使用一個指定的類,讓Spring來生成bean,並使用它的某個方法時,需要在aop配置上加上一句proxy-target-class="true",

否則用JUnit時,會出現:

java.lang.ClassCastException: com.sun.proxy.$Proxy6 cannot be cast to glut.daoImp2.DAOImp2

類似的錯誤.