【Spring Framework】什么是IoC?

英文全称:Inversion of Control
中文翻译:控制反转

1. 定义

IoC是面向对象的一种思想,意在控制对象获取依赖对象的方式,由原来在对象中通过硬编码获取依赖对象,转变成通过第三方(IoC容器)向对象推送依赖对象。

2. 对象与依赖对象的关系

在面向对象的世界中,需要多个对象共同协作完成业务功能实现。

而多个对象的共同协作便产生了对象与依赖对象的关系。

比如A对象需要用到B对象完成某一功能,那么需要在A对象中创建一个B对象。如此一来,A对象对B对象产生了依赖,对于A对象来说,B对象便是它的依赖对象。

3. IoC的实现方式

3.1 依赖注入(DI)

DI(Dependency Injection)是IoC的一种具体实现方式,Spring IoC容器便是通过这种方式实现控制反转。

DI的实现主要通过对象先在容器中注册(简单来说就是向容器打个招呼,需要哪些依赖对象),然后容器在程序运行期间将依赖对象注入给它。

Spring主要通过构造注入和设值注入两种方式实现。

下面是两种注入方式的示例代码:

<bean id="helloDAO" class="com.yale.dao.HelloDAO"></bean>

<!-- 设值注入 -->
<bean id="iHello2" class="com.yale.service.HelloService2">
      <property name="helloDAO" ref="helloDAO"></property>
</bean>

<!-- 构造注入 -->
<bean id="iHello3" class="com.yale.service.HelloService3">
      <constructor-arg ref="helloDAO"></constructor-arg>
</bean>

3.2 依赖查找(DL)

DL(Dependency Lookup)是传统的IoC实现方式,EJB用的就是这种方式。

DL的实现方式是对象调用容器提供的API,主动查找自己需要的依赖对象。

3.3 DI与DL的区别

3.3.1 被动与主动

DI是被动注入依赖对象,DL是主动查找依赖对象。

3.3.2 非侵入式与侵入式

DI是非侵入式的,也就是说容器可以随便更改,而不需要更改对象中的代码;

DL则是侵入式的,因为有调用容器提供的API,若更改容器,则需要修改对象中的代码;


IoC的本质:是将依赖对象的控制权交给了容器。


文章作者: 叶遮沉阳
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 叶遮沉阳 !
  目录