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. B/S与C/S区别

    B/S (Brower/Server)-->浏览器/服务器 程序完全部署在服务器上,用户通过浏览器访问应用程序,它是基于internet产物(在应用服务器中部署运行程序) c/s(Client/ ...

  2. Sqlserver列出所有数据库名,表名,字段名

    Sqlserver列出所有数据库名,表名,字段名   1.获取所有数据库名:   ? 1 SELECT Name FROM Master..SysDatabases ORDER BY Name   注 ...

  3. 手把手教你用动软.NET代码生成器实例教程

    动软实战攻略 手把手教你用动软 文档编号:20110421 版权所有 © 2004-2011 动软 在线帮助:http://help.maticsoft.com 目录   一.        产品介绍 ...

  4. java 如何接收数据集参数

    @RequestBody String requestBody  可以接收 josn  字符串 ,list 等等 public int updateLoaneePriorityNew(HttpServ ...

  5. ThinkPHP讲解(六)——添加数据

    添加数据到数据库有三种方式 第一种:使用数组添加 $model=D("Info"); //实例化对象 //添加数据的第一种方式:使用数组添加 //要添加的数组,必须是关联数组,ke ...

  6. zw版_Halcon-delphi系列教程_卫星航拍精确打击目标自动识别

    <zw版·Halcon-delphi系列原创教程> 卫星航拍精确打击目标自动识别 这几天,俄罗斯空军在叙利亚大显神威,美军有意见了,说俄罗斯是狂轰滥炸,不是精确打击.      不过,战斗 ...

  7. 有图有真相——关于“视频专辑:零基础学习C语言 ”

  8. OpenCV cv::Mat类

    using namespace cv; 1.Mat的声明: Mat m=Mat(rows, cols, type); Mat m=Mat(Size(width,height), type); type ...

  9. OpenStack 多台计算节点时的问题

    Contents [hide] 1 前言 2 bug 3 解决方法 4 网络问题 前言 添加一台计算节点后无法创建虚拟机.在调度层就错误: bug https://review.openstack.o ...

  10. android提示框

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