Spring 注入實現類報錯問題
阿新 • • 發佈:2018-12-20
在使用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