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. PostgreSQL pg_dump pg_dumpall and restore

    pg_dump dumps a database as a text file or to other formats. Usage: pg_dump [OPTION]... [DBNAME] Gen ...

  2. ADO.net 实体类 、数据访问类

    程序分三层:界面层.业务逻辑层.数据访问层 比较规范的写程序方法,要把业务逻辑层和数据访问层分开,此时需要创建实体类和数据访问类 实体类: 例 using System; using System.C ...

  3. HDU 4512 吉哥系列故事——完美队形(LCIS)

    Problem Description 吉哥这几天对队形比较感兴趣. 有一天,有n个人按顺序站在他的面前,他们的身高分别是h[1], h[2] ... h[n],吉哥希望从中挑出一些人,让这些人形成一 ...

  4. struts.xml什么时候加载

    http://www.cnblogs.com/jiemoxiaodi/p/5621697.html

  5. ios json parse

    参考:http://wenxin2009.iteye.com/blog/1671691

  6. php laravel curD

    Laravel PHP Web开发框架 Laravel是一套简洁.优雅的PHP Web开发框架(PHP Web Framework).它可以让你从面条一样杂乱的代码中解脱出来:它可以帮你构建一个完美的 ...

  7. paper 55:图像分割代码汇总

    matlab 图像分割算法源码 1.图像反转 MATLAB程序实现如下:I=imread('xian.bmp');J=double(I);J=-J+(256-1); %图像反转线性变换H=uint8( ...

  8. CSS3 Transform Matrix

    css3中的transform让我们操作变形变得很简单,诸如,translate–移动,scale–缩放,rotate–旋转,skew–斜切.这几个属性很方便,也很简单,但是其中matrix我们就不常 ...

  9. 夺命雷公狗ThinkPHP项目之----企业网站13之文章列表页的实现(主要是分页的实现)

    列表页这个其实是比较简单的一个,直接遍历除数据即可: public function lists(){ //$mod = M("Article")->select(); // ...

  10. PAT乙级 1019. 数字黑洞 (20)

    1019. 数字黑洞 (20) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 给定任一个各位数字不完全相同的4位 ...