##讨论控制反转与依赖注入的关系:
###什么是控制反转?
对象之间耦合度过高,必然造成牵一发而动全身的结局。
为解决对象间的耦合度过高的问题,软件专家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只管使用就可以。