依赖注入

来源:互联网 发布:burpee 知乎 编辑:程序博客网 时间:2024/04/28 11:12

已经一直在使用spring的框架,但实际上对依赖注入的概念有些模糊,今天把依赖注入这个概念稍作一下梳理。

首先是依赖,在代码中,我们可以把依赖直观的理解为调用(包括变量与函数),这里是广义的调用。举个例子,我们有一个Computer类,有一个Ielectric接口,电脑需要电的提供:

public Class Computer{   public void turnOn(){      Ielectric ielectric = new ???;      ielectric.provide();}

因此,从“

Ielectric ielectric = new ???;
”我们看到Computer依赖于Ielectric,但是后面“???”处我们会很纠结,到底是哪一种实现,是交流电?还是直流电?还是高压电?因为接口的实现太多,我们为了满足不同的情况,将必须写上很多份代码,而这些代码的功能基本上是一样的!这个我们复用和维护带来了巨大的不便,因此,我们就要想办法重构代码,使之摆脱接口实现不确定的问题。
public class Computer {    private ielectric;    public Computer(Ielectric ielectric) {        this.ielectric = ielectric;    }    public void turnOn() {        this.ielectirc.provide();    }}
重构后我们可以看出来,我们利用了构造函数,将ielectric以参数的形式传了进来,这就是将所依赖的类注入了进来,即依赖注入,该处是为构造函数注入。

对比上下两段代码,不难发现,前者是Computer主动去寻求Ielectric依赖,它依赖于Ielectric的实现,而后者Computer不再依赖于Ielectric的实现,任你是哪种电流,只要你实现了provide函数,都可以在我内部成功通过,实际上变成了所依赖的Ielectric寻找需要它的地方主动注入进来,这就是依赖的方向反转了,也就是我们所熟知的控制反转。

需要注意的是,依赖注入不是反射、IoC框架等等中的特有内容,而实际上是我们重构代码的一种思想,这点大家不能混淆。

0 0