首先說明,注入的對象確實為實現類的對象。(並不是實現類的代理對象,注入並不涉及代理)
如果只是單純注入是可以用實現類接收注入對象的,但是往往開發中會對實現類做增強,如事務,日志等,實現增強的AOP技術是通過動態代理實現的,而spring默認是JDK動態代理,對實現類對象做增強得到的增強類與實現類是兄弟關系,所以不能用實現類接收增強類對象,只能用接口接收。如:
//接口:IA //實現類:AImpl //增強類:AImplProxy AImpl aImpl = new AImpl(); //通過JDKProxyFactory創建代理對象 JDKProxyFactory factory = new JDKProxyFactory(aImpl); AImplProxy aImplProxy = factory.createProxy();//這個增強類對象aImplProxy 只能強轉為IA,而不能轉為AImpl,因為JDK代理得到的AImplProxy類與AImpl是兄弟關系而非父子
由於以上原因,如果將對象注入給實現類而非接口的話,在代理時就會報錯。
解決方法,讓Spring強制使用Cglib代理:
<aop:aspectj-autoproxy proxy-target-class="true"/>
cglib代理類和實現類之間是父子關系,自然可以用父類(實現類)去接收子類對象(代理類對象即增強類對象)。
不過應該不會需要這么做,使用接口本來就是解耦的,你直接用實現類接收注入對象豈不是失去了注入的意義。(為什么不直接new一個呢?)
2017-11-24 01:16:41