先看一段代碼:
1
package com.test;
2
public interface Movein
{
3
4
}
1
package com.test;
2
@Service(value="moveManager")
3
@Transactional
4
public class MoveManager implements Movein
{
5
6
}
在MoveAction中我們采用兩種方式得到MoveManager 的對象:
第一種:用@Autowired注解自動注入
@Autowired
private MoveManager moveManager;
第二種:用ApplicationContext中的getBean()
ApplicationContext ctx = *************
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:
<aop:config proxy-target-class="true"/>
或者把Movein改成abstract類。
posted on 2009-11-11 10:49
...... 閱讀(471)
評論(0) 編輯 收藏 所屬分類:
SPRING