1. 程式人生 > >Spring 注入實現類報錯問題

Spring 注入實現類報錯問題

在使用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