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. Codeforce Round #217 Div2

    e,妈蛋,第二题被hack了 没理解清题意,- -居然也把pretest过了,- -# A: 呵呵! B:包含任意一个子集的输出NO!,其他输出YES! C:贪心额,类似上次的Topcoder的500 ...

  2. SQL 面向对象

    1.面向过程 int a = 10;int b =5;int c = a+b; int r1 = 10;int r2 = 5;double c = r1*r1*3.14 - r2*r2*3.14 缺点 ...

  3. android中的权限(转)

    Android权限系统非常庞大,我们在Android系统中做任何操作都需要首先获取Android系统权限,本文记录了所有的Android权限问题,整理一下分享给大家. 访问登记属性 android.p ...

  4. Linux centOS7 下安装mysql5.7.10

    1:下载二进制安装包 http://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.10-linux-glibc2.5-x86_64.tar.gz 2:解压到 ...

  5. 【ubuntu】首选项和应用程序命令(preference & application)

     gnome-control-center  系统设置  gnome-control-center region  键盘布局  gnome-control-center screen  屏幕  gno ...

  6. SQL删除重复数据方法

    例如: id           name         value 1               a                 pp 2               a           ...

  7. iOS,破冰!

    首发:个人博客,更新&纠错&回复 iOS,破冰! 今年学的技术,以iOS自学为成本最高昂:花几千块买了台mac mini电脑,又前后买了6本书籍,从头到尾是30天时间,当然,这30天里 ...

  8. [置顶] 一个懦弱的IT人

    对自己近来的学习和工作做一个总结,规划一下未来. 还是从大三暑假说起,稀里糊涂的被拉去参加电子设计大赛,熬过了一段痛苦的时间.原本我是学计算机的,对硬件不太熟悉.不过经过一段时间痛苦的断断续续的学习, ...

  9. web跨页弹窗选值

    最近在项目中看到这样一种效果——点击当前网页文本框,然后弹出一个缩小的网页,并在网页里选择或填写数据,然后又返回当前网页,小网页关闭.感觉非常不错,其实在以前网上也看见过,只是当时没有留心.今天抽时间 ...

  10. 某硕笔试题mysql数据库部分(较为全面)

    Student(S#,Sname,Sage,Ssex) 学生表  Course(C#,Cname,T#) 课程表  SC(S#,C#,score) 成绩表  Teacher(T#,Tname) 教师表 ...