概念介绍
IOC
即控制反转(Inversion of Control),就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现和管理。IOC容器
IOC容器负责实例化、定位、配置应用程序中的对象及建立这些对象间的依赖。DI
即依赖注入(Dependency Injection),在IOC容器运行期间,动态的将某种依赖关系注入到对象之中。IoC和DI由什么关系呢?
其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
IOC原理
在软件开发过程中,系统的各对象之间,各模块之间,软件系统与硬件系统之间或多或少都会存在耦合关系,如果一个系统的耦合度过高,就会造成难以维护的问题。下图展示了系统中的耦合问题
为了解决上面介绍的耦合度过高的问题,IOC理论提出了借助“第三方”来实现具有依赖关系的对象之间的解耦。如下图所示
这样各个对象之间就不直接关联,而是在需要用到对方的时候由IOC容器(第三方)来管理对象之间的依赖关系,我们只需要维护相对独立的各个对象代码即可。
关键技术
反射
在运行状态中,根据提供的类的路径或者类名,动态的获取该类的所有属性和方法。工厂模式的改进
把IOC容器当做一个工厂,在配置文件或者注解中给出定义,然后利用反射技术根据给出的类名生成相应的对象。对象生成的代码以及对象之间的依赖关系,在配置文件中定义,这样就实现了解耦。
参考资料
[1]谈谈对Spring IOC的理解
[2] Spring的IOC原理[通俗解释一下]
[3]Spring IOC容器基本原理