报错:
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
类似的错误.