配置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
類似的錯誤.