IoC(Inverse of Control: 控制反转)是spring容器的内核, 字面意思是: 控制反转, 包含两个内容:(1) 控制, (2) 反转.那到底是什么东西的控制被反转了呢?

  对于软件来说, 就是某一接口的具体实现类的选择权从调用类中移除, 转交给第三方决定.

  IoC这个概念比较晦涩,最终软件界的泰斗Martin Fowler提出了DI(Dependency Injection: 依赖注入)的概念, 用来代替IoC. 即:

  让调用类对某一接口的具体实现类的依赖关系由第三方(容器或者协作类)注入, 以移除调用类对某一接口实现类的依赖.

  从注入方法上, 主要可以划分为: 构造函数注入, 属性注入, 接口注入. spring支持构造函数注入和属性注入.

1.构造函数注入

如下代码:

 /**
  * Created by xinfengyao on 16-2-27.
  */
 public class MoAttack {
     private GeLi geli;

     /**
      * 注入革离的具体扮演者
      * @param geli
      */
     public MoAttack(GeLi geli) {
         this.geli = geli;
     }
     public void cityGateAsk() {
         geli.responseAsk("墨者革离!");
     }
 }

 /**
  * Created by xinfengyao on 16-2-27.
  */
 public class Director {
     public void direct() {
         //(1)指定角色的扮演者
         Geli geli = new LiuDeHua();
         //(2)注入具体角色扮演者到剧本中
         MoAttack moAttack = new MoAttack(geli);
         moAttack.cityGateAsk();
     }
 }

MoAttack的构造函数不关心具体是谁扮演革离这个角色, 具体的角色扮演者有导演来安排

2.属性注入

属性注入可以有选择地通过setter方法完成调用类所需依赖的注入, 更加灵活方便:

 /**
  * Created by xinfengyao on 16-2-28.
  */
 public class MoAttack {
     private GeLi geli;

     public GeLi getGeli() {
         return geli;
     }

     /**
      * 属性注入
      * @param geli
      */
     public void setGeli(GeLi geli) {
         this.geli = geli;
     }

     public void cityGateAsk() {
         geli.responseAsk("墨者革离");
     }
 }

 /**
  * Created by xinfengyao on 16-2-28.
  */
 public class Director {
     public void direct() {
         Geli geli = new LiuDeHua();
         MoAttack moAttack = new MoAttack();

         // 调用属性Setter方法注入
         moAttack.setGeli(geli);
         moAttack.cityGateAsk();
     }
 }

和通过构造函数注入革离扮演者不同, 在实例化MoAttack时, 并未制定革离的具体扮演者, 而是在需要革离出场时, 才调用setGeli()方法注入扮演者.

3.通过容器完成依赖关系的注入

  虽然MoAttack和LiuDeHua实现了解耦, MoAttack无须关心角色实现类的实例化工作, 但是这些工作在代码中依然存在, 只不过是转移到了Director类中而已. 要想从这些工作中解脱出来, 我们就需要依赖第三方容器, 让它帮助我们完成类的初始化工作和装配工作. 从而能够让我们这些开发者从这些底层实现类的具体化, 依赖关系装配等工作中解脱出来.

  Spring 就是这样的一个第三方容器, 通过配置文件或注解描述类与类之间的依赖关系,自动完成类的初始化工作和依赖注入工作. 我们可以将以上实例通过配置文件实现:

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="geli" class="LiuDeHua"/>
    <bean id="moAttack" class="MoAttack">
        <property name="geli" ref="geli"/>
    </bean>
</beans>

  通过new XmlBeanFactory("beans.xml")等方式即可启动容器. 在容器启动时, Spring根据配置文件的描述信息, 自动实例化Bean并完成依赖关系的装配, 从容器中即可返回准备就绪的Bean实例, 后续可直接使用.

IoC容器概述的更多相关文章

  1. Spring的IoC容器概述

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/ioc-containers.html: IoC容器 Spring容器是Spring框架的核心.容器 ...

  2. Spring3.x企业开发应用实战读书笔记 —— 第三章IoC容器概述

    声明:    本篇博客绝大多数内容为<Spring3.x企业开发应用实战>一书原内容,所有版权归原书作者所有!,仅供学习参考,勿作他用! 3.2 相关Java基础知识 Java语言允许通过 ...

  3. Spring Framework的核心:IOC容器的实现

    2.1   Spring IoC容器概述 2.1.1 IoC容器和依赖反转模式 依赖反转的要义,如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测性的降低.依赖控制反转的实 ...

  4. Spring的IOC容器第一辑

    一.Spring的IOC容器概述 Spring的IOC的过程也被称为依赖注入(DI),那么对象可以通过构造函数参数,工厂方法的参数或在工厂方法构造或返回的对象实例上设置的属性来定义它们的依赖关系,然后 ...

  5. Java开发工程师(Web方向) - 04.Spring框架 - 第2章.IoC容器

    第2章.IoC容器 IoC容器概述 abstract: 介绍IoC和bean的用处和使用 IoC容器处于整个Spring框架中比较核心的位置:Core Container: Beans, Core, ...

  6. 详解Spring IoC容器

    一.Spring IoC容器概述 1.依赖反转(依赖注入):依赖对象的获得被反转了. 如果合作对象的引用或依赖关系的管理由具体对象来完成,会导致代码的高度耦合和可测试性的降低,这对复杂的面向对象系统的 ...

  7. IOC容器 - Autofac概述

    Autofac是比较出名的Ioc容器之一,熟悉Orchard的应该熟知.本文直接介绍autofac用法 一.开始 1.NuGet添加或者直接http://code.google.com/p/autof ...

  8. Spring IOC之容器概述

    1.SpringIOC容器和beans介绍 IOC的依赖注入是这样的,对象定义他们的依赖也就是他们需要在一起起作用的对象是通过构造器参数以及工厂方法的参数或者是当他们被构建或者是从工厂中返回时设置在对 ...

  9. NET 自带IOC容器MEF指初体验

    转自:http://www.cnblogs.com/ulex/p/4186881.html IOC容器:工具较多,大体功能都相同,大都需要事先对接口与实现进行配对(通过代码或配置文件),然后由系统自动 ...

随机推荐

  1. Ruby操作Excel的方法与技巧大全

    测试工作中,批量的数据通常会放到excel表格中,测试输出的数据写回表格中,这样输入输出易于管理,同时清晰明了 使用ruby来操作excel文件首先需要在脚本里包含以下语句 require'win32 ...

  2. php第三方登陆

    学习之前,请大家先看一下oAuth协议. 首先呢,我们进入QQ互联的官方网站 http://connect.qq.com登入我们自己的QQ号,没有QQ号的小伙伴可以忽略本篇博文分享!

  3. 利用API自动建立GL科目段组合

    1.检查存在性,如没有则新增 fnd_flex_keyval.validate_segs('CREATE_COMBINATION'                                    ...

  4. 【pyQuery分析论坛】精英乒乓论坛

    In [25]: t= h('table') In [26]: In [26]: t('.mainbox').text() Out[26]: u'\u72b6\u6001 \u4e3b\u9898 \ ...

  5. 有关OpenGL着色语言(一)

    刚接触OpenGL着色语言...,不定期增加内容 1.OpenGL着色语言(GLSL)是什么? 用于OpenGL的面向过程的高级着色语言,是近年来图形编程领域中出现的最重要的新型开发技术,使用Open ...

  6. VisualSVNServer启动失败错误处理

    VisualSVNServerServer service failed to start:     服务已返回特定的服务器错误代码:(0x8007042a)     Please check Vis ...

  7. android提示框

    // 对话框 AlertDialog.Builder builder = new Builder(MainActivity.this); builder.setMessage("是否确认删除 ...

  8. IT职业选择与定位

           (一)  位置有很多,最适合你的是哪个? 有的人在电子技术的层面工作,开发出性能强劲的芯片和硬件产品:有的人在别人开发的芯片和硬件上开发各种操作系统和驱动程序:有的人在各种操作系统或设备 ...

  9. Backup: Array in Perl6

    Array in Perl6 继承List,而List又继承Iterable,Positional,Cool ARRAY.pop ARRAY.shift ARRAY.push: VALUES ARRA ...

  10. javaWeb 使用jsp开发 if 标签

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"% ...