什么是IOC?

IOC全称为控制反转(Inversion Of Control),别名依赖注入(Dependency Injection)。

控制反转即指我们获取依赖的方式发生了反转。

假设存在如下情况,A依赖C对象,B依赖C、D对象。在利用控制反转前可能是这样的:

A需要在内部创建一个C对象,B也需要在内部创建C、D对象(也可能与A共用C)。

但是在控制反转后可能是这样的:

通过一个中间层隔离了AB与CD之间的耦合,由IOC Service Provider来管理C、D对象,A、B只需向IOC Service Provider发送一个请求注入的消息即可。

这样最直接的好处就是统一管理,代码便于修改与维护。

简单可理解的例子有很多。

比如装修新房,非控制反转就是自己打造家具,自己装修。控制反转就是下个订单,上门包装修一条龙。

又或者出门穿衣,非控制反转即自己去衣柜找衣服穿上出门,控制反转则是眼神示意一下,就有人拿衣服帮你穿上再出门。

IOC实现的方式

构造方法注入:

IOC Service Provider通过特殊配置(指定包名、类名、构造函数名、参数名、参数类型等等),将你需要或是依赖的对象传递到你的构造函数的参数中。因此如果是在如下代码中:

public Person(String name) {
    this.name = name;
}

构造函数的参数name就被IOC Service Provider赋值了,我们不需要担心this.name等于空值。

构造方法注入方式比较直观,对象被构造完成后,即进入就绪状态,可以马上使用。这就好比你刚进酒吧的门,服务生已经将你喜欢的啤酒摆上了桌面一样。坐下就可以马上享受一份清凉与惬意。

setter方法注入

setter方法类似构造函数,也是由IOC Service Provider先扫描一遍。事实上因为都交由IOC Service Provider处理,整个程序启动有一个先纳入管理,再一一分配的过程。通过类似于构造函数的配置的将对象注入到setter方法参数上,然后赋值。代码如下:

public class Person {
    String name;

    public void setName(String name) {
        this.name = name;
    }
}

setter方法注入虽然不像构造注入那样,让对象构造完成后即可使用,但相对来说更宽松一些,可以在对象构造完再注入。这就好比你可以到酒吧坐下后再决定要点什么啤酒,可以是哈啤也可以是其他的,随意性比较强。如果你不急着喝,这种方式当然是最适合你的。

接口注入

相比较于前面两种方法,接口注入就比较麻烦。被注入对象如果想要IOC Service Provider为其注入依赖对象。就必须实现某个接口。这个接口提供了一个方法,用来为其注入依赖对象,IOC Service Provider最终通过这些接口来了解应该为被注入对象注入什么依赖对象。

这就像你同样在酒吧点酒,为了让服务生理解你的意思,你就必须带上一顶啤酒杯式的帽子,看起来有点多此一举了。

三种方式的比较

  • 构造方法注入。优点在于对象在构造完成后,就进入了就绪状态,可以马上使用。缺点就是,当依赖对象比较多,构造方法的参数列表会比较长。而通过反射构造对象的时候,对相同类型的参数的处理会比较困难,维护和使用也比较麻烦。
  • setter方法注入。因为方法可以命名,所以setter方法注入在描述性上要比构造方法注入好一点。另外,setter方法可以被继承,允许设置默认值。缺点在于无法在构造完成后马上就可以用。
  • 接口注入。接口注入现在不被提倡使用,处于"退役状态"。它强制被注入对象实现不必要的接口。带有侵入性。

IOC基本理解的更多相关文章

  1. IOC的理解

    转载http://www.cnblogs.com/xdp-gacl/p/4249939.html 很不错的文章,虽说是java的,但是.net也通用,所以复制一分,拿来看看挺不错的. 1.1.IoC是 ...

  2. 谈谈对Spring IOC的理解(转)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  3. 谈谈对Spring IOC的理解

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  4. Spring系列之谈谈对Spring IOC的理解

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IOC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  5. 谈谈对Spring IOC的理解【转】

    学习过Spring框架的人 一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大 ...

  6. Spring IOC的理解

            学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理 ...

  7. 谈谈对Spring IOC的理解(转载)

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  8. C# 一个初学者对 依赖注入 IOC 的理解( 含 Unity 的使用)

    通过 人打电话 来谈谈自己对IOC的理解 版本1.0 public class Person { public AndroidPhone Phone { get; set; } public void ...

  9. 浅析对spring中IOC的理解

    学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

  10. 依赖注入(DI)和控制反转(IOC)的理解,写的太好了。

    学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...

随机推荐

  1. 数据库:SQL Server自增长列的编号

    SQL Server表中的自动编号ID重新开始排列 说法一: 有两种方法: 方法1: truncate table 你的表名 --这样不但将数据删除,而且可以重新置位identity属性的字段. 方法 ...

  2. Codeforces Round #277.5 (Div. 2)-D. Unbearable Controversy of Being

    http://codeforces.com/problemset/problem/489/D D. Unbearable Controversy of Being time limit per tes ...

  3. Python IDE推荐

    八个最佳Python IDE 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Python是一种功能强大.语言简洁的编程语言.本文向大家推荐8个适合pyt ...

  4. 在Xcode中编辑运行 Python 脚本

    http://www.zhihu.com/question/19872198 打开Xcode,File->New->Project选中OS X下的Other点击External Build ...

  5. React项目搭建及依赖安装

    一.前提 首先保证node.js已安装完成... 安装完成后,打开cmd命令行,输入 node -v 和 npm -v 来查看版本号,如果显示则安装完成. 二.安装react脚手架 在cmd命令行中输 ...

  6. perl学习之I/O基础

    1.从标准输入进行输入<STDIN> 2.从钻石操作符进行输入<> 3.参数调用@ARGV 4.向标准输出进行输出 5.用printf进行格式化输出 1.<STDIN&g ...

  7. Java的9种基本数据类型以及封装类

    Java的9种基本数据类型以及封装类 基本类型 大小(单位/字节) 默认值 封装类 byte 1 (byte)0 Byte short 2 (short)0 Short int 4 0 Integer ...

  8. PAT Basic 1027

    1027 打印沙漏 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行 ...

  9. TCP三次握手及四次挥手详解及常见面试题

    https://blog.csdn.net/ZWE7616175/article/details/80432486

  10. win10系统中virtualbox无法安装64位系统

    win10系统中virtualbox无法安装64位系统 先总结下如果想在虚拟机中安装64位的Linux系统,最好能满足这几个条件: 64位CPU 64位操作系统 64位的虚拟机软件 开启BIOS虚拟化 ...