IOC
(Inversion of Control),即控制反转
,是一种设计思想。在Java开发中,IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。IOC 是Spring
框架的核心思想之一。
传统的依赖关系和实现方式:
复杂对象包含简单对象,复杂对象的实现依赖于简单对象的实现,比如汽车包含轮子,汽车对象依赖于轮子对象,在汽车类的实现中会调用轮子类生成实例对象,这样的好处是在初始化时,底层的实现逻辑对于高层是隐藏的,易于开发,但是当我们需要修改简单对象时,就需要同时修改复杂对象,如果复杂对象的子对象多或层级多的时候,底层的改动就会牵一发动全身,修改工程量大。
关键在于,如何实现复杂对象和简单对象之间的解耦合呢?
首先我们要说一说依赖倒置原则
(Dependency Inversion Principle):
- 高层模块不应该依赖于底层模块,二者都应该依赖于抽象。
- 抽象不应该依赖于细节,细节应该依赖于抽象。
复杂对象不直接创建简单对象,而是定义好接口,简单对象的实现依赖于接口定义;复杂对象决定需要什么,简单对象去实现这样的需求,但是复杂对象不需要了解简单对象是怎么实现的,类与类之间实现了解耦合;
控制反转
(Inversion of Control) 就是依赖倒置原则的一种代码设计的思路。具体采用的方法就是所谓的依赖注入(Dependency Injection)
依赖注入
:复杂对象定义接口,允许简单对象通过接口将自己注入到复杂对象中(Dependency injection means giving an object its instance variables),创建简单对象的控制权就从复杂对象的实现中移除了,而由第三方控制,这样在接口规则允许的范围内,简单对象可以任意修改内部的实现,而不必同步对复杂对象进行修改。
采用控制反转存在两个问题,第一,每次创建复杂对象时,都需要手动创建大量的简单对象,代码重复且容易出错;二是,创建这些简单变量必须理解深层实现逻辑。
控制反转容器
(Inversion of Control container)通过配置文件自动对复杂对象进行初始化,减少了初始化的代码量,并隐藏了底部实现细节,解决了上面的两个问题。这样就同时具备了依赖反转的解耦合优势,又具备了传统实现方式的隐藏底层实现的优势。
总结IOC的优缺点:
优点: 降低了类与类之间的解耦度,提高了程序的灵活性和可维护性。
缺点: 创建过程引入第三方不如原来直观,性能上也会略有损耗。
参考资料:
- https://www.zhihu.com/question/23277575
- http://www.importnew.com/13619.html