spring控制反转(IOC)
一、IOC的基础知识以及原理
- 背景:在采用面向对象方法设计的软件系统中,底层实现都是有N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。即软件系统中对象之间的耦合,对象A和对象B之间有关联,对象B又和对象C有依赖关系,这样对象和对象之间有着复杂的依赖关系,所有才有了控制反转这个理论。
- 什么是控制反转(IOC)?
- IOC是Inversion of Control的缩写,有的翻译成控制反转,还有翻译成为控制反向或者控制倒置。
- 简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现是对外部来说是透明的,从而降低了解决问题的复杂度,从而可以灵活地被重要和扩展。IOC理论提出的观点大体是这样的:借助于“第三方”实现具有依赖对象之间的解耦,如下图所示:
- 即把各个对象类封装之后,通过IOC容器来关联这些对象类。这样对象与对象直接就通过IOC容器进行联系,但对象与对象之间没有什么直接联系。
- 如果去掉IOC容器后系统中的对象A与对象B就有了直接联系,如右图所示
- 比如好多的对象类要关联起来的话,就会变得很复杂,如右图所示:
所以提出IOC控制反转还是很有必要的。
- 为什么要把这种方式叫做控制反转呢?
- 软件系统在没有引入IOC容器之前,对象A依赖对象B,那么A对象在实例化或者运行到某一点的时候,自己必须主动创建对象B或者使用已经创建好的对象B,其中不管是创建还是使用已创建的对象B,控制权都在我们自己手上。
- 如果软件系统引入IOC容器之后,对象A和对象B之间失去了直接联系,所以当对象A实例化和运行时没如果需要对象B的话,IOC容器就会主动创建一个对象B注入到对象A所需要的地方。
- 通过前面的对比,可以看到对象A获得依赖对象B的过程,由主动行为变成了被动行为,即把创建对象交给了IOC容器处理,控制权颠过来了,这就是控制反转的由来。
- IOC的别名:依赖注入(DI)
- 控制被反转之后,获得依赖对象的过程由自身管理对象变为IOC容器主动注入。于是“控制反转”有了一个更为合适的名字叫做“依赖注入(Dependency Injection,DI)”。
- 所谓依赖注入就是有IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
- 所以依赖注入(DI)和控制反转(IOC)是从不同的角度描述同一件事,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
- 使用IOC的好处IOC的原理:控制反转是Spring框架的核心。其原理是基于面向对象(OO)设计原则。也就是说所有的组件都是被动的,所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容器负责管理。简单来讲就是由容器控制程序之间的关系,而非传统实现中,有程序代码直接控制,挤在一个类中调用另外一个类。这也就是所谓“控制反转”的概念所在:控制权由应用代码转到了外部容器,控制权的转移,即反转。
- 可维护性比较好,非常便于进行单元测试,便于调试程序和诊断故障。代码中的每一个class都可以单独测试,彼此之间互不影响,只要保证自身的功能无误即可,这就是组件之间耦合或者无耦合带来的好处。
- 每个开发团队的成员都只需要关注自己要实现的业务逻辑,完全不用去关心其他人的工作进展,因为你的任务跟别人没有任何关系,你的任务可以单独测试,你的任务也不用依赖被人的组件,再也不用扯不清责任了。
- 可复用性好,我们可以吧把具有普遍性的常用组件独立出来,反复应用到项目中的其他部分,或者其他项目,当前这也是面向对象的基本特征。显然IOC更为地贯彻了这个原则,提高了模块的可复用行。符合接口标准的实现,都可以插接到支持此标准的模块中。
- IOC生成对象的方式转为外置方式,也就是把对象生成放置文件里进行定义,这样当我们更换一个实现子类将会变得很简单,只要修改配置文件就可以了,完全具有热插拔的特性。
- IOC采用的是动态代理。

更多精彩