概念
IoC:Inversion of Control .控制反转,是一种设计思想。spring中的实现为 IoC容器,分为两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,另一个是实现ApplicationContext接口的高级容器系列。
DI:Dependency Injection。依赖注入。
对于像我一样的初学者,总是对IoC和DI的概念有着模糊不清的认识。今天我就梳理一下我的理解,努力将这两个概念描述清楚。
IOC
Q:控制反转首先说的是什么控制被反转了?
A:控制反转说的依赖对象的创建的控制权被反转了,说了更细一点:传统开发中,当我们类的实例(对象)A里面依赖另外一个对象B的时候,我们都是直接在实例A里面new 一个对象B。这里,我们说对象A 是拥有对象B的创建控制权的。在Spring内,对象之间的这种相互依赖管理由IOC 容器进行管理,这里,IOC容器控制了A依赖对象B的创建,所以说这里控制权被反转了。前面说过IOC容器是IOC这种设计思想的一种实现。
Q:这里为什么用反转 这两个字来描述呢?
A:我想,包括我在内的大多数初学者对于这里为什么用“反转”这两个字来描述控制权的反转深表疑惑。毕竟在我们看来,并不像是控制权的反转,而是控制权由自己交由第三方。
其实这里说的反转,我们可以从依赖对象的获取方面来理解。传统开发中,我们的类的实例A都是主动的去创建依赖的对象B。引入IOC思想后,对象的创建交由IOC容器来管理,这时候,我们的类的实例A被动的接受依赖的对象B。所以这样看来,依赖对象的获取确是被反转了。
DI
依赖注入讲的是组件之间的依赖关系的容器动态注入。
IOC和DI的关系
控制反转和依赖注入,其实是同一个概念的不同角度的描述。控制反转从依赖对象创建这个角度进行描述,依赖注入从依赖关系的角度进行描述。大家也没必须拘泥于这两个概念细节上死死拔不出来。这种概念上的理解并没有什么标准答案,只要大家理解到位即可。