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

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

###什么是控制反转?spring

对象之间耦合度太高,必然形成牵一发而动全身的结局。编程

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

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

图1 图1函数

图2 图2单元测试

为何叫控制反转(IoC)这个名字?测试

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

二、软件系统在引入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 对象。像这种非本身主动初始化依赖,而经过外部来传入依赖的方式,咱们就称为依赖注入。

好处:
一、解耦,将依赖之间解耦 。
2.、由于已经解耦,因此方便作单元测试,尤为是 Mock 测试。


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

IoC框架使用依赖注入做为实现控制反转的方式,可是控制反转还有其余的实现方式,例如说ServiceLocator,因此不能将控制反转和依赖注入等同。

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


Spring中的依赖注入

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

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


###总结:

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

相关文章
相关标签/搜索