依赖注入与硬编码

在学习NodeJs时将路由和服务器整合时,提到“我们的服务器应当知道路由的存在并加以有效利用,我们可以通过硬编码的方式将这一依赖项绑定到服务器上,但其他语言的编程经验告诉我们这会是一件非常痛苦的事,因此我们将使用依赖注入的方式较松散地添加路由模块”,借此想深入了解一下依赖注入和硬编码。

一.什么是依赖注入和硬编码

  1. 在软件工程领域,依赖注入(Dependency Injection)是用于实现控制反转(IOC,Inversion of Control)的最常见方式之一。具体来说,如果一个类A的功能需要借助于类B,那么就称类B是类A的依赖,如果在类A的内部去实例化类B,那么两者会出现较高的耦合,一旦类B出现了问题,类A也需要进行改造,这样程序会很难维护。要解决这个问题,就要把类A对类B的控制权抽离出来,交给一个第三方去做,把控制权反转给第三方,就称作控制反转。控制反转是一种思想,是能够解决问题的一种可能的结果,而依赖注入是其最典型的实现方法。由第三方(我们称作IOC容器)来控制依赖,把他通过构造函数,属性或者工厂模式等方法,注入到类A内,这样就极大程度地对类A和类B进行了解耦。
  2. 在一个类中直接创建另一个类的对象的代码,和硬编码(hard-coded strings)以及硬编码的数字(magic numbers)一样,容易导致耦合,被称为硬初始化(hard init)。

二.为什么需要依赖注入

  1. 硬初始化在修改时,需要修改创建处的代码,同时不便于测试,也会导致代码可读性问题。
  2. 依赖注入降低了依赖和被依赖类型间的耦合,在修改被依赖的类型实现时,不需要修改依赖类型的实现,同时,对于依赖类型的测试,可以更方便的使用mocking object替代原有的被依赖类型,以达到对依赖对象独立进行单元测试的目的。

三.依赖注入如何工作:三种方式(A依赖B)

  1. 构造函数注入:通过A的构造,把B传入(Spring中的构造注入)。
  2. 属性注入:通过设置A的属性,把B传入(Spring中的设值注入)。
  3. 接口注入:通过A的接口,把B传入。

参考: https://blog.csdn.net/coderder/article/details/51897721
Spring中的依赖注入: https://blog.csdn.net/taijianyu/article/details/2338311
知乎: https://blog.csdn.net/taijianyu/article/details/2338311