现在位置:首页>spring 教程>弄清楚Spring的Ioc(控制反转)和DI(依赖注入)正文

弄清楚Spring的Ioc(控制反转)和DI(依赖注入)

开头先理解清楚Ioc(控制反转)和DI(依赖注入),这个是看本文的重点

Ioc目的是解耦

耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。

如何降低系统之间、模块之间和对象之间的耦合度,是软件工程永远追求的目标之一。

为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的"解耦",Spring是很好实现IOC框架产品。

Ioc(控制反转)

名称由来: 软件开发在使用IOC容器之前,假如对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。

无论是创建还是使用对象B,控制权都在自己手上。

软件开发在使用IOC容器之后,这种情况就完全改变了,由于IOC容器的加入,对象A与对象B之间失去直接联系。

所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。

通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为被动行为,控制权颠倒过来,这就是"控制反转"这个名称的由来。

DI(依赖注入)

名称由来: 2004年,Martin Fowler探讨IOC和DI的问题,既然IOC是控制反转,那么到底是"哪些方面的控制被反转了呢?"。

经过详细地分析,他得出答案:"获得依赖对象的过程被反转"。控制被反转之后,获得依赖对象的过程由自身管理变为由IOC容器管理主动注入。

给"控制反转"取一个更合适的名字叫做"依赖注入(Dependency Injection)"。实际上给出实现IOC的方法是:注入。

所谓依赖注入,就是由IOC容器在运行期间,动态地将对象某种依赖关系注入到对象之中。

以滴滴平台例子解释

以滴滴平台为例子:我作为打车端的会员,司机作为司机端的会员司机。

我有坐车的需求,告诉滴滴平台我什么时间点需要什么样子的车,滴滴平台召集司机端的司机,根据我需要的要求分配一辆车给我。 这样子就很好解释Ioc,滴滴平台做为Ioc,我和司机就是Ioc的对象或bean。

Spring的IoC容器

在实现控制反转和依赖注入的过程中:


Spring中提供两种IoC容器: