控制反转,又名依赖注入,是一种设计思想,用来降低对象之间耦合关系
一般而言:分层体系结构中,上层调用下层接口,上层依赖下层执行,即调用者依赖被调用者。
Ioc:上层采用一定的机制选择不同的下层实现,完成控制反转,即调用者决定被调用者。
IoC通过注入一个实例化的对象来达到解耦和的目的;
使用这种方法后,对象不会被显式调用,而是根据需求通过IoC容器(如Spring)来提供。
例如:
为卖茶的商店提供一个管理系统,开业时只卖绿茶;
随着规模的扩大,未来可能会改变茶类,如绿茶变红茶。传统方法:针对茶抽象化一个基类,绿茶继承该基类:AbstractTea t = new GreenTea();
缺点:改变茶类,所有的AbstractTea t = new GreenTea();都要改成RedTea();改动量大改动一:采用设计模式
使用工厂模式将创建对象的行为包装起来:
把创建对象的过程交给TeaFactory类的getTea方法,具体创建对象的逻辑交给TeaFactory
当需要将绿茶修改为红茶时,只需修改TeaFactory创建对象的逻辑即可,只修改一个地方。
本质:将程序中变动的逻辑移动到工厂类,增强了扩展性。改动二:采用IoC设计思想,程序有更好的可扩展性:
Spring容器将会根据配置文件来创建调用者对象,同时把被调用者的实例化对象通过构造函数或
set()方法的形式注入到调用者对象中。
当变动时,只需修改配置文件,无需修改代码。
Spring采用IoC方式来实现把实例化的对象注入到开发人员自定义的对象中,具有强扩展性。
优点:
1、通过IoC容器,开发人员不需要关注对象如何被创建的,同时增加新类也非常方便,只需要修改配置文件即可实现对象的“热插拔”。
2、IoC容器通过配置文件来确定需要注入的实例化对象,非常便于进行单元测试。
缺点:
1、对象是通过反射机制实例化出来的,因此会对系统的性能有一定的影响。
2、创建对象的流程变得复杂。