原创

控制反转(IOC)与依赖注入(DI)详解

1. IOC的理论背景

file file

耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson 1996年提出了IOC理论,用来实现对象之间的“解耦”,目前这个理论已经被成功地应用到实践当中。

2. 什么是IOC

IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。

IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦。如下图:

file

由于引进了中间位置的“第三方”,也就是IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。

3. 控制反转(IOC)名字由来

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

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

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

4. IOC也叫依赖注入(DI)

既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中

所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,控制反转指获取依赖对象的过程被反转了,依赖注入指实现IOC的方式是动态地将某种依赖关系注入到对象之中。其实都是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦

5. 优缺点

优点:解藕。
缺点:复杂度提升,通过反射方式来生成对象,运行效率有所降低

6. 实现

控制反转(IOC)两种实现方式:依赖查找(DL)【废弃:因为有入侵,没有完全解藕】和依赖注入(DI)。

依赖注入(DI)的形式主要有三种,我分别将它们叫做构造注入( Constructor Injection)、设值方法注入( Setter Injection)和接口注入( Interface Injection)

正文到此结束
本文目录