在使用spring 时,假如在controller中注入了impl 实现类可能会出现报错的情况。
为什么是“可能”,① 假如没用使用spring aop ,则不会报错。
② 类没用使用接口也不会报错。
1、为什么使用 aop 会导致报错:
spring aop的实现是基于动态代理
如果目标对象实现了接口,那么在默认情况下会采用JDK的动态代理实现AOP。
如: 接口 a
实现类 aimpl
代理类b
//通过JDKProxyFactory创建代理对象
JDKProxyFactory factory = new JDKProxyFactory(aimpl);
AImplProxy b= factory.createProxy();
//这个增强类对象b 只能强转为a,而不能转为aimpl,因为JDK代理得到的b类与aimpl是兄弟关系而非父子
解决方式:xml配置,强制使用cglib 方式(低版本spring 可能需要引入cglib的jar 包)
<aop:aspectj-autoproxy proxy-target-class="true"/>
2、为什么没有接口的不会报错
如果没有接口,则会使用cglib 动态代理方式。
cglib使用继承的方式实现代理。所以不需要接口。
因为是继承,所以被代理的目标最好不要使用 final