控制反转(Inverse of Control,IoC),是一种降低对象之间耦合关系的设计思想。
一般而言,在分层体系结构中,都是上层调用下层的接口,上层依赖于下层的执行,即调用者依赖于被调用者。而通过IoC方式,使得上层不再依赖于下层的接口,即通过采用一定的机制来选择不同的下层实现,完成控制反转,使得由调用者来决定被调用者。
IoC通过(DI)注入一个实例化的对象来达到解耦和的目的。使用这种方法后,对象不会显式调用而是根据需求通过IoC容器(例如Spring)来提供。
采用IoC机制能够提高系统的可扩展性,如果对象之间通过显式调用进行交互会导致调用者与被调用者存在着非常密切的联系,其中一方的改动将会导致程序出现很大的改动。
Spring容器会根据配置文件来创建调用者对象,同时把被调用的对象的实例化对象通过构造函数或set()方法的形式注入到调用者对象中,当需要修改被调用对象时,只需要修改配置文件,而不需要修改其他代码。
简而言之,Spring采用IoC的方式来实现把实例化的对象注入到开发人员自定义的对象中,具有较强的可扩展性。
IoC优点:
- 通过IoC容器,开发人员不需要关心对象如何被创建的,同时增加新类也非常方面,只需要修改配置文件即可实现对象的“热插拔”;
- IoC容器可以通过配置文件来确定需要注入的实例化对象,因此非常便于进行单元测试。
IoC缺点:
- 对象是通过反射机制实例化出来的,因此会对系统的性能有一定的影响;
- 创建对象的流程变得比较复杂。