配置AOP时报错:java.lang.ClassCastException: com.sun.proxy.$Proxy2 cannot be cast to

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_22078107/article/details/85873724

 报错:

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

类似的错误.

猜你喜欢

转载自blog.csdn.net/qq_22078107/article/details/85873724