什么是IOC?_贾州的博客-ioc

最后更新 :2023-02-16 18:05:24

引言

目录

引言

背景

1.什么是ioc

1.1控制反转(IOC)到底为什么要起这么个名字

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

3.IOC的优点

灵活性

可读性

可测试性

4.IOC的缺点

5.IOC容器的技术剖析

6.参考博文


  1. ? 本文旨在说清楚IOC到底是什么,没有什么高深的技术,大哥们看到这里可以绕行了。本文主要是自己根据他人文献的总结和学习,有引用到的文章,在参考博文中均已注明。

? 本文重在学习,仅为转载,仅为学习笔记,切勿用于其他用途。

背景

我们知道在面向对象设计的软件系统中,它的底层都是由N个对象构成的,各个对象之间通过相互合作,最终实现系统地业务逻辑[1]

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??

?

  ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?图1 软件系统中耦合的对象

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

齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。对象之间的耦合关系是无法避免的,也是必要的,这是协同工作的基础。现在,伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系,因此,架构师和设计师对于系统的分析和设计,将面临更大的挑战。对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形。

?

图2 对象之间的依赖关系

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

1.什么是ioc

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

  1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC 这个概念。对于面向对象设计及编程的基本思想

,简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。

?

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

对象之间已经没有了耦合关系,彼此毫无联系,这样的话,当你在实现A的时候,根本无须再去考虑B、C和D了,对象之间的依赖关系已经降低到了最低程度。

1.1控制反转(IOC)到底为什么要起这么个名字

对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。

?

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

“哪些方面的控制被反转了呢?”,Martin Fowler经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。

所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中

所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。

3.IOC的优点

灵活性

为广泛使用的接口更改实现类更简单(例如,用生产实例替换模拟web服务)

更改给定类的检索策略更简单(例如,将服务从类路径移动到JNDI树)

添加拦截器很简单,只需在一个地方完成(例如,向基于JDBC的DAO添加缓存拦截器)

可读性

该项目有一个统一一致的组件模型,没有工厂(如DAO工厂)

如果没有依赖项查找代码(例如对JNDI InitialContext的调用),代码更简洁,也不会杂乱无章

可测试性

当依赖项通过构造函数或setter公开时,它们很容易替换mock

更容易的测试导致更多的测试

更多的测试会带来更好的代码质量、更低的耦合性和更高的内聚性

4.IOC的缺点

使用IOC框架产品能够给我们的开发过程带来很大的好处,但是也要充分认识引入IOC框架的缺点,做到心中有数,杜绝滥用框架。

??? 第一、软件系统中由于引入了第三方IOC容器,生成对象的步骤变得有些复杂,本来是两者之间的事情,又凭空多出一道手续,所以,我们在刚开始使用IOC框架的时候,会感觉系统变得不太直观。所以,引入了一个全新的框架,就会增加团队成员学习和认识的培训成本,并且在以后的运行维护中,还得让新加入者具备同样的知识体系。

??? 第二、由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。如果你要追求运行效率的话,就必须对此进行权衡。

??? 第三、具体到IOC框架产品(比如:Spring)来讲,需要进行大量的配制工作,比较繁琐,对于一些小的项目而言,客观上也可能加大一些工作成本。

??? 第四、IOC框架产品本身的成熟度需要进行评估,如果引入一个不成熟的IOC框架产品,那么会影响到整个项目,所以这也是一个隐性的风险。

??? 我们大体可以得出这样的结论:一些工作量不大的项目或者产品,不太适合使用IOC框架产品。另外,如果团队成员的知识能力欠缺,对于IOC框架产品缺乏深入的理解,也不要贸然引入。最后,特别强调运行效率的项目或者产品,也不太适合引入IOC框架产品,像WEB2.0网站就是这种情况。

5.IOC容器的技术剖析

IOC中最基本的技术就是“反射(Reflection)”编程,

根据给出的类名(字符串方式)来动态地生成对象。这种编程方式可以让对象在生成时才决定到底是哪一种对象。反射的应用是很广泛的,很多的成熟的框架,比如象Java中的Hibernate、Spring框架,.Net中 NHibernate、Spring.Net框架都是把“反射”做为最基本的技术手段。

6.参考博文

[1] 架构师之路(39)---IoC框架 ,王泽宾,CSDN, 2009.

[2] Inversion of Control Containers and the Dependency Injection pattern ,Martin Fowler,2004.

[3] 深度理解依赖注入(Dependence Injection),EagleFish(邢瑜琨), 博客园, 2007.

[4]Inside ObjectBuilder ,黄忠成, CSDN, 2006.

[5][转]Object Builder Application Block ,吕震宇,博客园, 2006.

[6] https://blog.csdn.net/ivan820819/article/details/79744797

- END -

海口有免税店吗(海南两家离岛免税店获批设立 世界最大单体免税店月底开业)

世界最大单体免税店月底开业【海南两家离岛免税店获批设立】北京青年报记者10月15日了解...

轻奢小香风套裙,精致时髦,穿上就有一种 “毫无束缚感的优雅”|套裙|时髦|套装_小香风外套

  总有一个时刻,时间紧、不想搭配 但又要穿出时尚感。  总有那样一个场合,需要优雅正...