1.2.4 依赖倒置原则

依赖倒置原则(Dependence Inversion Principle,DIP),指的是程序要依赖于抽象接口,不要依赖于具体实现。简单地说就是要求对抽象进行编程,不要对实现进行编程。更简单的解释,就是“面向接口编程”。

面向接口编程,相信大家都比较熟悉这个概念,也理解其中的意义。继续以1.2.3小节的Spring源码示例进行说明,我们可以看到容器类GenericApplicationContext和Bean工厂核心类DefaultListableBeanFactory都实现了父类BeanDefinitionRegistry中的registerBeanDefinition方法。父类BeanDefinitionRegistry就是接口,我们要面向接口编程,就是要面向BeanDefinitionRegistry编程。那么Spring源码中哪里能体现出面向BeanDefinitionRegistry编程呢?带着这个疑惑,我们看看,是谁调用了registerBeanDefinition方法,以及是如何调用的,代码如下:

请看以上代码为大家提供的注释,我们可以看到registry的类型是BeanDefinitionRegistry接口,而不是具体的容器子类GenericApplicationContext和Bean工厂子类DefaultListableBeanFactory。面向接口BeanDefinitionRegistry进行方法的调用,就是面向BeanDefinitionRegistry编程,即面向接口编程。

关于依赖倒置原则,也有一些其他观点的补充,如高层模块不应该依赖低层模块,都应该依赖它们的抽象、细节依赖抽象等,其实都是对“面向接口编程”的另外一种表达方式,这里就不再过多地说明。

笔者总结了这样一句话供大家玩味,或许有助于大家对以上四个原则的认识和理解:“单一职责原则以职责为基准划分类和接口;划分出来的接口需要最小化,剔除无用接口方法,在接口隔离原则下进行精确的使用;子类对父类的实现需要依据里氏替换原则,在实现所有抽象方法的前提下,可以增加个性化功能,至此子类和父类就创建完成了;当我们使用该类时,要面向接口编程,遵循依赖倒置原则。”让我们继续对剩余的原则进行说明,然后在1.2.6小节对这句话进行最后的补充。