系统设计:依赖反转与依赖注入

依赖反转

依赖

为什么要将依赖反转,因为当存在依赖时,被依赖的模块A会先进行编译,而依赖的模块B会在A编译后才能进行编译。

定义

软件设计存在抽象层与是实现层之分,一般情况下,抽象依赖于实现。

但是抽象层稳定,实现层容易变化,抽象层应该有较实现层更高的复用性,它就应该我们设计和考量的核心与重点,而不是具体的实现,这样一来,要求我将依赖关系反转过来,即实现应该依赖于我们的抽象,这样的设计才是灵活和易于扩展的。

因此出现依赖反转的概念,即面向接口编程的。接口不提供任何的实现,可以真正意义上进行抽象层的工作。

依赖注入

问题

当进行依赖反转时,编程的可能情形是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
interface IService{
public void doSomething();
}

class ServiceImpl implements IService{
public void doSomething(){
// do something......
}
}

class Component
{
private IService service=new ServiceImpl(); //这里是基于接口进行编程,但却在构造时与具体的实现发生了耦合
//后继方法中会使用该service
}

在此的问题是,当实例化service时,必须要使用到实现类

依赖注入的实现

运用spring的依赖注入会完美地解决“抽象在创建时刻对实现产生依赖”的问题,在我们代码里,抽象将永远不需要再被指向他的具体实现了,这个过程会放到sping 的配制文件里,使用依赖注入的方式完成

参考

  1. 关于依赖反转(基于接口编程)和依赖注入的一个小问题的领悟