spring的依赖注入,为什么用接口的实现类而不是父类的继承类呢?
在spring框架里,当一个类中需要依赖某个组件,我们用接口的形式去声明这个组件,但是不给它真正的实例。然后由xml文件来注入实现该接口的实例。因而当我们需要更换另外一个形式的组件时,我们只需要在xml中给它注入另一个实现该接口的实例就可以。由于在这个类中该组件是以接口形式声明的,我们调用的是该接口的方法,因此无论注入的实例如何变更,方法依旧是可以使用的。这种情况下,我们靠方法的重写来实现功能的变更。因此这个类的代码无需变更,实现了解耦。
我突然想,如果这个组件以类的形式去声明,然后我们注入的是它的子类。我们调用的是父类的方法,变更实例后,由于实例都是子类,父类的方法也可以使用,因此代码也无需变更。从根本上来讲,同样是用方法的重写来实现功能的变更。那我们用类来代替接口,对方法进行统一的命名,对实例进行统一的访问,不是也可以吗?
小弟才疏学浅,想了半天只感觉用接口更规范更简单,用类声明的话有一些“舍近而求远”。
那么为什么我们都是以接口的形式去声明这个组件呢?希望各位达人给予解答。
[解决办法]
因为Spring 的那个代理只支持接口类型,不支持类类型
[解决办法]
通常是service层需要aop。用接口的话,AOP可以使用java自带的动态代理,但是有点麻烦要写接口。用类就要用第三方包cglib,但是简单,不用写接口。至于你说的注入子类,没必要(当然也不会错),注入自己就可以了。
[解决办法]
接口代理jdk。
cglib 类的代理。
[解决办法]