控制反转(Ioc)与依赖注入(DI)

前端之家收集整理的这篇文章主要介绍了控制反转(Ioc)与依赖注入(DI)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

##讨论控制反转与依赖注入的关系:

###什么是控制反转?

对象之间耦合度过高,必然造成牵一发而动全身的结局。

解决对象间的耦合度过高的问题,软件专家Michael Mattson提出了IoC理论,用来实现对象间的"解耦"。

**控制反转(Inversion of Control) **是一种面向对象编程中的一种设计原则,用来减低计算即代码之间的耦合度。
其基本思想是:借助于"第三方"实现具有依赖关系的对象之间的解耦。

图1

图2

为什么叫控制反转(IoC)这个名字?

1、 软件系统在没有引入IOC容器之前,如图1所示,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。

2、软件系统在引入IOC容器之后,这种情形就完全改变了,如图2所示,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。


###什么是依赖注入?

依赖注入就是将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。

public class Human {
    ...
    Father father;
    ...
    public Human(Father father) {
        this.father = father;
    }
}

将 father 对象作为构造函数的一个参数传入。在调用 Human 的构造方法之前外部就已经初始化好了 Father 对象。像这种非自己主动初始化依赖,而通过外部来传入依赖的方式,我们就称为依赖注入。

好处:
1、解耦,将依赖之间解耦 。
2.、因为已经解耦,所以方便做单元测试,尤其是 Mock 测试。


###控制反转和依赖注入的关系

IoC框架使用依赖注入作为实现控制反转的方式,但是控制反转还有其他的实现方式,例如说ServiceLocator,所以不能将控制反转和依赖注入等同。

控制反转是一种思想
依赖注入是一种设计模式


Spring中的依赖注入

简单来说,spring 使用xml配置文件,通过<bean>获取相应的对象(每个bean对应一个对象的实例,默认是单例模式,即在程序的生命周期中,所有的对象只有一个实例,进行重复使用),并存储在IoC容器中。

运行时,当需要某个对象,就可以从IoC容器中获取。也就是注入依赖。


###总结:

1、控制反转是一种在软件工程中解耦合的思想,调用类只依赖接口,而不依赖具体的实现类,减少了耦合。控制权交给了容器,在运行的时候才由容器决定将具体的实现动态的“注入”到调用类的对象中。 2、依赖注入是一种设计模式,可以作为控制反转的一种实现方式。依赖注入就是将实例变量传入到一个对象中去(Dependency injection means giving an object its instance variables)。 3、通过IoC框架,类A依赖类B的强耦合关系可以在运行时通过容器建立,也就是说把创建B实例的工作移交给容器,类A只管使用就可以。

猜你在找的设计模式相关文章