- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
JAVA培训:什么是控制反转(IOC)
一、IoC理论的背景
我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由
N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。
图:软件系统中耦合的对象
如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分
别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描
述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,
协同工作,共同完成某项任务。我们可以看到,在这样的齿轮组中,如果有一个
齿轮出了问题,就可能会影响到整个齿轮组的正常运转。
齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。
对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。现在,
伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常
会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设
计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全
身的情形。
图2:对象之间复杂的依赖关系
耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,
以及软件系统和硬件系统之间。如何降低系统之间、模块之间和对象之间的耦合
度,是软件工程永远追求的目标之一。为了解决对象之间的耦合度过高的问题,
软件专家Michael Mattson 提出了IOC 理论,用来实现对象之间的“解耦”,目前
这个理论已经被成功地应用到实践当中,很多的J2EE 项目均采用了 IOC 框架产
品Spring 。
二、什么是控制反转(IoC)
IOC 是Inversion of Control 的缩写,多数书籍翻译成“控制反转”,还有些书
籍翻译成为“控制反向”或者“控制倒置”。
1996 年,Michael Mattson 在一篇有关探讨面向对象框架的文章中,首先提
出了 IOC 这个概念。对于面向对象设计及编程的基本思想,前面我们已经讲了
很多了,不再赘述,简单来说就是把复杂系统分解成相互合作的对象,这些对象
类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而
且可以灵活地被重用和扩展。IOC 理论提出的观点大体是这样的:借助于“第三
方”实现具有依赖关系的对象之间的解耦,如下图:
图:IOC 解耦过程
大家看到了吧,由于引进了中间位置的“第三方”,也就是IOC 容器,使得
A 、B、C、D 这4 个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”
了,全部对象的控制权全部上缴给“第三方”IOC 容器,所以,IOC 容器成了整
个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象
粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联
系,这就是有人把IOC 容器比喻成“粘合剂”的由来。
我们再来做个试验:把上图中间的IOC 容器拿掉,然后再来看看这套系统:
图:拿掉IoC 容器后的系统
我们现在看到的画面,就是我们要实现整个系统所需要完成的全部内容。这
时候,A 、B、C、D 这4 个对象之间已经没有了耦合关系,彼此毫无联系,这样
的话,当你在实现A 的时候,根本无须再去考虑B、C和D了,对象之间的依赖
关系已经降低到了最低程度。所以,如果真能实现IOC容器,对于系统开发而言,
这将是一件多么美好的事情,参与开发的每一成员只要实现自己的类就可以了,
跟别人没有任何关系!
我们再来看看,控制反转(IOC)到底为什么要起这么个名字?我们来对比一下:
软件系统在没有引入IOC容器之前,如第一个图中所示,对象A依赖于对象
B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象 B
或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。
软件系统在引入 IOC容器之后,这种情形就完全改变了,如第三个图所示,
由于IOC容器的加入,对象A 与对象 B之间失去了直接联系,所以,当对象 A
运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的
地方。
通过前后的对比,我们不难看出来:对象A
文档评论(0)