1、应用背景:
打开机械手表的后盖,齿轮组中各个齿轮互相啮合在一起,一个齿轮的运作会对其他的齿轮造成不同程度的影响。多个齿轮共同运作,带动指针完成旋转。
软件系统中不同对象的依赖关系(耦合关系)。就像不同的齿轮运作时相互影响一样。系统越复杂,耦合越复杂。
耦合度高带来的问题:
- 不同模块的开发人员开发进度及工作分配相互牵制
- 新加入的人员培训费用增加
- 对团队整体素质要求较高
- 维护投入的资金和人力较高
- 可能导致代码泄露问题,安全性降低
2、解决办法:
引入IOC(Inversion of ControlInversion of Control)即控制反转理论,降低对象间的耦合度
3、什么是控制反转(IOC)
IOC 容器作为第三方,就像是汽车控制台控制四个轮子一样,四个轮子之间相互不影响,控制权归控制台,控制台成为整个汽车的核心,由控制台控制四个轮子运动。
4、为什么要叫控制反转
系统未引入IOC之前,A对象想用B对象时需要先创建B对象,主动权在系统
引入IOC后,由于AB对象无依赖关系,运行到需要B对象时,IOC会创建一个B对象注入到A对象需要的地方,系统只需被动等待接收对象B即可。
系统主动变为被动,控制权颠倒过来了,这就是“控制反转”这个名称的由来。
助于理解,举个例子:
小孩想下床,没有保姆的时候需要自己主动找到鞋子并穿好,然后下床。
有保姆的时候,当小孩想下床的时候,保姆会给小孩找来鞋子,小孩只需要被动等待保姆拿来鞋子并穿上,就可以下床。
5、IOC的别名:依赖注入(DI)
6、IOC带来的好处:
- 不同模块开发人员对系统的开发和测试独立,利于分配工作和新员工上手,开发效率、产品质量和安全性提高
- 维护难度降低,调试程序和诊断故障
- 更换子类简单快速,复用性好
- 结构清晰,一目了然
7、 使用IOC框架应该注意什么
第一、引入了一个全新的框架,就会增加团队成员学习和认识的培训成本,并且在以后的运行维护中,还得让新加入者具备同样的知识体系。
第二、由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。如果你要追求运行效率的话,就必须对此进行权衡。
第三、具体到IOC框架产品(比如:Spring)来讲,需要进行大量的配制工作,比较繁琐,对于一些小的项目而言,客观上也可能加大一些工作成本。
第四、IOC框架产品本身的成熟度需要进行评估,如果引入一个不成熟的IOC框架产品,那么会影响到整个项目,所以这也是一个隐性的风险。
8、结论:
一些工作量不大的项目或者产品,不太适合使用IOC框架产品。另外,如果团队成员的知识能力欠缺,对于IOC框架产品缺乏深入的理解,也不要贸然引入。最后,特别强调运行效率的项目或者产品,也不太适合引入IOC框架产品,象WEB2.0网站就是这种情况。