使用Spring AOP 需要注意的問題

 

》如果是使用Jdk動態代理實現Spring AOP,Spring容器的getBean方法獲得的對象是不能轉型成該Bean定義的Class類型。

如下定義的id爲calculatorService的bean,class類型是CalculatorServiceImpl,該類實現了ICalculatorService接口並且我們給這個Bean定義了使用Jdk動態代理實現的AOP。

<bean id=”calcuatorService” class=”CalculatorServiceImpl”>

使用Spring容器的getBean方法是不能轉型成CalculatorServiceImpl,只能轉型成ICalculatorService接口,如下代碼會報ClassCastException異常。

CalculatorServiceImpl service = applicationContext.getBean(“calculatorService”);

異常信息是:Exception in thread "main" java.lang.ClassCastException: $Proxy0 cannot be cast to com.performance.service.CaculaeServiceImpl

這是因爲使用Jdk動態代理實現Spring AOP,getBean獲得的對象是Jdk動態代理生成的代理類的對象,這個代理類只是實現了ICalculatorService接口,而沒有繼承CalculatorServiceImpl。 使用CGLib動態代理不會有這個問題,因爲CGLib動態代理生成的代理類是繼承我們的目標類的,而不是實現目標接口。

》如果使用CGLib動態代理實現Spring AOP,通過Spring容器的getBean方法獲得的對象不能直接引用目標類的公有屬性,讀取或者修改公有屬性。

如下定義的id爲calculatorService的bean,class類型是CalculatorServiceImpl。 並且我們給這個Bean定義了使用CGLib動態代理實現的AOP。

<bean id=”cacluatorService” class=”CalculatorServiceImpl”>

在CalculatorServiceImpl類有一個公有屬性type

public class CalculatorServiceImpl{

       public String type;
              ……...

}

使用Spring容器的getBean方法是轉型成CalculatorServiceImpl類的對象service,但我們不能調用service.type來獲得或者修改type屬性。

這是因爲使用CGLib動態代理實現的Spring AOP,調用service.type是引用CGLib代理類對象的屬性,而不是目標對象的type屬性。

發佈了28 篇原創文章 · 獲贊 16 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章