结论: IOC 的目的是为了提高程序的可维护性
背景
理解IOC(inversion of control),需要从依赖倒置原则开始讲起,
人类有四大约束——东西不够、生命有限、互相依赖、需要协调。
依赖是程序设计和日常生活中不可避免的问题,大厦的高层需要依赖底层的基地,程序的高层类需要依赖底层类。因为符合我们每天的生活场景,所以最容易想到的程序设计是:高层类依赖底层类
高级类依赖低级类的可维护性差,试想一栋20层的楼想加高到200层,是不行的,硬改的话,地基低级类不支持,必须要要把地基拆除修改低级类,才能在原址新建一个200层的楼
但程序不是现实世界的直接映射,我们可以通过一定的设计方式提高可维护性,实现依赖倒置原则 IOC,IOC 其实就是把高级类对低级类的紧密依赖耦合,拆解,制造出一种低级类依赖高级类的现象(其实本质上低级类不可能依赖高级类)
代码
下面以 车 车架 底盘 轮胎 作为对象分析
- 高层类依赖底层类
每个高层类的构造函数中都有new 底层类的语句,如果这时我要将轮胎的size参数改为动态传入,每个高层类都需要修改,这对于大型项目的维护简直就是灾难,于是有了下面的解决方案
- 底层类依赖高层类(IOC)
每个低级类初始化后,会注入到高级类(IOC容器干的),这样如果修改轮胎的
sizw参数,只需要修改Tire
分析
我们可以看一下两种方式的初始化语句,高层依赖底层,只有一句,底层依赖高层有好几句(有几层就会有几个初始化语句)
聪明(懒惰)的程序员们怎么会写这么多语句呢,于是BeanFactory(工厂模式)就派上用场。
程序相当于一个工厂客户,告诉BeanFactory我需要一个Car实例,于是BeanFactory就坑次坑次的找需要啥底层类Tire Bottom Framework,然后依次初始化、注入,最后返回一个Car实例
总结
其中 依赖倒置原则 控制反转是思路,IOC容器 依赖注入 BeanFactory是具体实现方式