》如果是使用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屬性。