
2

3

4


2

3

4

5

6

在MoveAction中我們采用兩種方式得到MoveManager 的對象:
第一種:用@Autowired注解自動注入
private MoveManager moveManager;
第二種:用ApplicationContext中的getBean()
MoveManager moveM = (MoveManager)ctx.getBean("moveManager");
采用第一種方法,當調用Action時會拋出類似的異常:BeanCreationException: Could not autowire field : private com.test.MoveManager com.test.MoveAction.moveManager
采用第二種方法,當執行MoveManager moveM = (MoveManager)ctx.getBean("moveManager");時會拋出類似的異常:java.lang.ClassCastException: $Proxy40 cannot be cast to com.test.MoveManager 。把代碼改為:Movein moveM = (Movein)ctx.getBean("moveManager"); 后運行正常,但這不是我想要的結果,我并不想改變強制轉換類型。
現在來說說為什么會出現這種問題和解決方法。Spring AOP部分使用JDK動態代理或者CGLIB來為目標對象創建代理。默認情況如果被代理的目標對象實現了至少一個接口,則會使用JDK動態代理。所有該目標類型實現的接口都將被代理。 若該目標對象沒有實現任何接口,則創建一個CGLIB代理。這就說明了為什么強制類型是MoveManager時會出現ClassCastException異常而強制類型是Movein時運行正常,因為MoveManager被JDK代理。如果你希望在不改變代碼的情況下代理目標對象的所有方法,而不只是實現自接口的方法(強制使用CGLIB代理)只需要將<aop:config>的proxy-target-class 屬性設為true:
或者把Movein改成abstract類。