SpringAOP有两种代理方式:JDK动态代理和CGLIB。
如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理(该目标类型实现的所有接口都将被代理)。
如果被代理的目标对象没有实现任何接口,则会使用CGLIB代理。
所以,当你将一个JDK动态代理的对象Cast为一个Class而不是Interface的时候,就会报ClassCastException
这时,就要强制使用CGLIB代理
<aop:config proxy-target-class="true"> ... </aop:config>
或在使用@AspectJ时强制使用CGLIB代理
<aop:aspectj-autoproxy proxy-target-class="true"> <aop:include name="bean1" /> <aop:include name="bean2" /> .... </aop:aspectj-autoproxy>