博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring从入门到精通(一)----IoC(控制反转)
阅读量:6998 次
发布时间:2019-06-27

本文共 1428 字,大约阅读时间需要 4 分钟。

理论背景


    在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过相互合作,最终实现系统的业务逻辑。

这里写图片描述

    如果我们打开机械手表的后盖,就会看到与上面类似的情景,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。上图描述的的就是这样的一个齿轮组,他拥有多个独立的齿轮,这些齿轮互相啮合在一起,协同工作,共同完成某项任务。我们可以看到,在这样的齿轮组中,如果有一个齿轮出了问题,就可能会影响到整个齿轮组的正常运转。

    齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。

    现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。

这里写图片描述

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

什么是控制反转(IoC)


Inversion of Control,英文缩写为IoC,不是什么技术,而是一种设计思想。

    简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖关系的对象之间的解耦,如下图:

这里写图片描述

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

    我们再来做个试验:把上图中间的IOC容器拿掉,然后再来看看这套系统:

这里写图片描述

    我们现在看到的画面,就是我们要实现整个系统所需要完成的全部内容。这时候,A、B、C、D这4个对象之间已经没有了耦合关系,彼此毫无联系,这样的话,当你在实现A的时候,根本无须再去考虑B、C和D了,对象之间的依赖关系已经降低到了最低程度。所以,如果真能实现IOC容器,对于系统开发而言,这将是一件多么美好的事情,参与开发的每一成员只要实现自己的类就可以了,跟别人没有任何关系!

    然后我们再看一下为什么IoC叫控制反转?

1、没有引入IOC之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,A直接使用new关键字创建B的实例,程序高度耦合,效率低下,无论是创建还是使用B对象,控制权都在自己手上。

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

    通过对比发现,A在获取对象B的过程中,有主动变为被动,控制权颠倒了过来,这就是控制反转这个名称的由来。

    代码中的具体实现在下一篇博客中实现,敬请期待!

你可能感兴趣的文章
javascript深拷贝(deepClone)
查看>>
阿里天池大赛:最后一公里急速配送
查看>>
高效的 iOS 版本检测方法
查看>>
三级菜单的实现
查看>>
Hadoop的“Hello world”---WordCount
查看>>
JS删除数组里指定值的问题
查看>>
为什么需要云压力性能测试?
查看>>
[福利]如何下载Tumblr的视频
查看>>
Webpack--loaders
查看>>
Android 网络请求详解
查看>>
【mongoDB高级篇③】综合实战(1): 分析国家地震数据
查看>>
(译)基于 Promise 的JavaScript 电池新 API
查看>>
Centos 安装postgresql
查看>>
JavaFX 已从 JDK 中独立拆分,早期预览版开放下载
查看>>
如何应对服务器压力?服务器横向扩展(加机器)策略漫谈
查看>>
avalon js单页面滑动切换
查看>>
垃圾回收机制算法分析
查看>>
特斯拉史上最重要发布会?Elon Musk 交底全自动驾驶计划 ...
查看>>
Unity组件:Audio Chorus Filter PRO only 音频合声滤波器 ...
查看>>
Flutter MergeableMaterialItem
查看>>