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数据库操作总结

    创建表 语法:如下 create table     table_name     (column_name         column_type(parametes)options,…); 注意: ...

  2. Eclipse安装Ruby插件应该注意的几点

    http://www.aptana.com/products/studio3/success_plugin.html Installing via Eclipse Please copy the fo ...

  3. C#: 异步委托

    http://www.cnblogs.com/yingzhongwen/p/4568350.html 讲了委托与事件,但是对异步委托研究得还不够深入. http://www.cnblogs.com/l ...

  4. paper 88:人脸检测和识别的Web服务API

    本文汇总了全球范围内提供基于Web服务的人脸检测和识别的API,便于网络中快速部署和人脸相关的一些应用. 1:从How-old的火爆说起 最开始,网站的开发者只是给一个几百人的群发送email,请他们 ...

  5. wireshark抓包

    ip.addr==IP地址(192.168.1.100)&& http

  6. IIS、Asp.net 编译时的临时文件路径(转载)

    IIS上部署的ASP.NET站点都会在一个.Net Framework的特定目录下生成临时编译文件增加ASP.NET站点的访问性能,有时候需要手动去删除这些临时编译文件,特别是发布新版本代码到IIS后 ...

  7. scrapy学习记录

    scrapy是一个用来爬取一个或多个网站的数据,提取数据的应用框架.下载过程非常复杂,而且会遇到各种问题.所以写个博客来记录下. 安装好python2.7之后,就可以开始.安装scrapy前还需要安装 ...

  8. Delphi xe 下快捷使用 FastMM 的内存泄露检测功能

    Delphi xe 集成了FastMM,调试程序是的时候可以方便地检查内存泄露了.  使用方法:在project中,添加一行: ReportMemoryLeaksOnShutdown := Debug ...

  9. 所谓完整的linux系统包括哪些部分呢?【转】

    本文转载自:http://www.eeskill.com/article/index/id/1358.html 简介:三部分:bootloader.linux kernel(linux内核).root ...

  10. 161031、java.util.StringTokenizer使用及源码

    import java.util.StringTokenizer; public class TestStringTokenizer { public static void main(String[ ...