日期:2014-05-18  浏览次数:20814 次

spring的依赖注入,为什么用接口的实现类而不是父类的继承类呢?
在spring框架里,当一个类中需要依赖某个组件,我们用接口的形式去声明这个组件,但是不给它真正的实例。然后由xml文件来注入实现该接口的实例。因而当我们需要更换另外一个形式的组件时,我们只需要在xml中给它注入另一个实现该接口的实例就可以。由于在这个类中该组件是以接口形式声明的,我们调用的是该接口的方法,因此无论注入的实例如何变更,方法依旧是可以使用的。这种情况下,我们靠方法的重写来实现功能的变更。因此这个类的代码无需变更,实现了解耦。

我突然想,如果这个组件以类的形式去声明,然后我们注入的是它的子类。我们调用的是父类的方法,变更实例后,由于实例都是子类,父类的方法也可以使用,因此代码也无需变更。从根本上来讲,同样是用方法的重写来实现功能的变更。那我们用类来代替接口,对方法进行统一的命名,对实例进行统一的访问,不是也可以吗?

小弟才疏学浅,想了半天只感觉用接口更规范更简单,用类声明的话有一些“舍近而求远”。

那么为什么我们都是以接口的形式去声明这个组件呢?希望各位达人给予解答。
------解决方案--------------------
因为Spring 的那个代理只支持接口类型,不支持类类型
------解决方案--------------------
通常是service层需要aop。用接口的话,AOP可以使用java自带的动态代理,但是有点麻烦要写接口。用类就要用第三方包cglib,但是简单,不用写接口。至于你说的注入子类,没必要(当然也不会错),注入自己就可以了。
------解决方案--------------------
接口代理jdk。

cglib 类的代理。
------解决方案--------------------
引用:
Quote: 引用:

通常是service层需要aop。用接口的话,AOP可以使用java自带的动态代理,但是有点麻烦要写接口。用类就要用第三方包cglib,但是简单,不用写接口。至于你说的注入子类,没必要(当然也不会错),注入自己就可以了。

我去百度了一下,写成接口是不是为了动态代理的需要?因为jdk自带的动态代理需要接口作为参数?如果抛开aop这个问题先不管的话,我的需求只是“当我需要更换注入的组件的时候,就xml文件中进行更换bean” 那么声明成接口和声明成类是不是一样的了?


就是动态代理
------解决方案--------------------
说到底还是动态代理,jdk规定动态代理必须用接口;当然也可以用类,用cglib可以去处理就可以了。一样的。。。