Spring学习(三)IOC控制反转与DI依赖注入
IOC(Inversion of Control,控制反转)是spring的核心,贯穿始终。所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系:传统开发模式:对象之间互相依赖IOC开发模式:IOC容器安排对象之间的依赖Spring所倡导的开发方式就是:所有的类都会在Spring容器当中登记,告诉Spring你是一个什么东西,你需要
·
IOC(Inversion of Control,控制反转)是spring的核心,贯穿始终。
所谓IOC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系:
- 传统开发模式:对象之间互相依赖
- IOC开发模式:IOC容器安排对象之间的依赖
Spring所倡导的开发方式就是:所有的类都会在Spring容器当中登记,告诉Spring你是一个什么东西,你需要什么东西。
然后Spring会在系统运行到适当的时候把你所需要的东西主动送给你。
同时,也把你交给其他需要你的东西。
所有类的创建、销毁都由Spring控制。
也就是说:控制对象生存周期的不在是引用他的对象而是Spring。
对于某个具体的对象而言:以前是他控制其他对象,现在是所有的对象都被Spring所控制。
所以这就叫控制反转。
接下来我们介绍以下IOC的理论背景
我们先来观察几张图:
图1:耦合的对象
图2:解耦的过程
图3:理想的系统
我们可以看到在软件系统在没有引入IOC容器之前就像图1所示,对象A依赖与对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动的去创建对象B,或者是使用已经创建的对象B。无论是创建还是使用对象B,控制权全都在自己手上。
在软件系统引入了IOC容器之后,这种情景就完全改变了。
那么如图2所示,由于IOC容器的加入,对象A和对象B之间失去了直接的联系。所以当对象A运行到了需要对象B 的时候,IOC容器会主动地创建一个对象B注入到对象A所需要的地方。
那么,通过前后的对比,我们不难看出:对象A获得对象 B的过程由主动行为变成了被动行为。控制权颠倒过来了,这就是控制反转。这就是其名称的由来。
而图3则是我们在开发过程中所期望看到的理想的系统。
既然IOC是控制反转,那么到底是哪些方面的控制被反转了呢?
获得依赖对象的过程被反转了。
控制被反转之后,获得依赖对象的过程由自身的管理变为了由IOC容器主动的注入。
于是,控制反转便有了一个更合适的名字,叫做:依赖注入(DI)
IOC的另外的名字叫做依赖注入(Dependency Injection),所谓的依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
我们来举一个生活当中常见的例子来解释下什么是依赖注入:
大家对USB设备和USB接口应该都很熟悉,USB为我们使用电脑提供了很大的方便。现在有很多的外部设备都支持USB设备。
现在我们利用主机接口和USB设备来实现一个任务:从我们的USB设置读取一个文件
电脑主机读取文件时他一点也不关心电脑主机上连接的是什么设备,而且他确实也没有必要知道。他的任务就是读取USB接口,挂接的设备只要符合USB接口的标准就可以了。所以我给电脑主机连接上一个U盘,那么主机就从U盘上读取文件。那么我给主机连接上一个外置硬盘,那么电脑便从外置硬盘上读取文件。挂接外部设备的权利来由我做主,即控制权是归我的。至于USB接口挂接的是什么设备电脑主机是决定不了的,他只能被动的接收。当电脑主机需要外部设备时根本不用他告诉我,我会主动的为他挂接上他所需要的外部设备。
这就是我们生活当中常见的一个依赖注入的例子。在整个过程中,我就起到了一个IOC容器的作用。
通过这个例子,依赖注入的思路就已经非常清楚了:
当电脑主机读取文件的时候,我就将他所要依赖的外部设备帮他挂接上。整个外部设备注入的过程和一个被依赖的对象在系统运行是被注入到另一个对象内部的过程是完全一样的。
我们把依赖注入应用到软件系统当中再来描述一下这个过程是什么样子的:
对象A依赖与对象B,那么当对象A需要用到对象B 的时候,IOC容器就会立即的创建一个对象B送给对象A。
IOC的容器就是一个对象制造工程,你需要什么,他就会传送给你,你直接使用就可以了。再也不用关心你所需要的东西是如何制成的,也不用关心最后是怎么被销毁的。这一切都全部由IOC容器来包办,在传统的实现中由程序内部代码来控制组件之间的关系,我们经常使用new关键字来实现两个组件之间关系的组合,这种实现方式会造成组件之间耦合。IOC很好的解决了这种问题,他将实现组件间到的关系由程序内部提炼到了程序外部。也就是说由容器在运行期间将组件间的某种依赖关系动态的注入到组件当中。
那么IOC到底给我们的编码过程中带来了什么样的好处呢?
IOC在编程过程中不会对业务对象构成很强的侵入性,
使用IOC之后,对象具有更好的可实行性,可重用性和可扩展性:
- 降低组件之间的耦合度
- 提高开发效率和产品质量
- 统一标准,提高模块的复用性
- 模块具有热插拔特性
总结:
IOC的通俗理解如下:
• IOC(控制反转):说的是创建对象实例的控制权从代码控制剥离到IOC容器控制,实际就是你在xml文件控制,侧重于原理
• DI(依赖注入):说的是创建对象实例时,为这个对象注入属性值或其它对象实例,侧重于实现
更多推荐
已为社区贡献7条内容
所有评论(0)