Spring: IoC原理

IoC控制反转

  1996年,Michael Mattson在一篇有关探讨面向对象框架的文章中,首先提出了IOC(Inversion of Control)这个概念。IOC理论提出的观点:借助于“第三方”实现具有依赖关系的对象之间的解耦。全部对象的控制权全部上缴给“第三方”IOC容器,所以,IOC容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用。

控制反转为了解决对象之间耦合度过高的问题。

  控制权的转移:应用程序本身不负责依赖对象的创建和维护,而是由外部容器负责创建和维护。

  假设对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

DI依赖注入

  2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。他的这个答案,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。

  DI依赖注入是IoC的一种实现方式,用来反转依赖(IoC的具体实现方式),就是将依赖对象的创建和绑定转移到被依赖对象类的外部来实现,创建对象并且组装对象之间的关系。
  依赖对象A不创建被依赖对象B,但是在对象A中描述创建对象B的方式(setter或构造器)。在代码中不直接与被依赖的对象和服务连接,可以在配置文件中描述哪一个组件需要哪一项服务。