什么是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. 将 PROTOCOL 的方法声明为 MUTATING

    将 PROTOCOL 的方法声明为 MUTATING 由 王巍 (@ONEVCAT) 发布于 2014/08/17 Swift 的 protocol 不仅可以被 class 类型实现,也适用于 str ...

  2. React框架搭建单页面应用package.json基本包和依赖包

    { //依赖包 "devDependencies": { //babel "babel-core": "6.24.1", "bab ...

  3. UVa-12096-集合栈计算机

    这题的话,我们读入操作之后,首先对于空集就是初始化为空. 我们可以使用typedef 对于 set 重命名为Set,这样就可以直接用Set()的语法进行空集的初始化了. 这题主要是对于集合的处理,我们 ...

  4. tkinter学习-事件绑定与窗口

    阅读目录: 事件绑定 Toplevel组件 标准对话框 事件绑定: 说明:对于每个组件来说,可以通过bind()方法将函数或方法绑定到具体的事件上. 事件序列: 说明:用户需要使用bind()方法将具 ...

  5. python3.x 多路IO复用补充asyncio

    asyncio模块是python之父写的模块,按说应该是靠谱的,python3.6版本定义为稳定版本. 说明书:https://docs.python.org/3/library/asyncio.ht ...

  6. Spring中使用注解 @Scheduled 执行定时任务

    来自:http://blog.51cto.com/dwf07223/1557145 注解@Scheduled 可以作为一个触发源添加到一个方法中,例如,以下的方法将以一个固定延迟时间5秒钟调用一次执行 ...

  7. JS获取单选框checked的value方法

    ; var obj = document.getElementsByTagName("input"); document.getElementById('gender').oncl ...

  8. Java实现——字符串分割以及复制目录下的所有文件

    0.  前言 今天有个需求,把Android中data/data目录下指定(通过读预置的XML文件)的多个应用下的多个目录全部内容通过OTG模式复制到U盘中. 首先读取XML文件内的某个节点的属性值, ...

  9. skkyk:题解 洛谷P3865 【【模板】ST表】

    我不会ST表 智推推到这个题 发现标签中居然有线段树..? 于是贸然来了一发线段树 众所周知,线段树的查询是log(n)的 题目中"请注意最大数据时限只有0.8s,数据强度不低,请务必保证你 ...

  10. 【SaltStack】通过Master给Minion安装MySQL

    一.IP信息说明 [Master] IP: 192.168.236.100 [Minion] IP: 192.168.236.101 二.配置SaltStack 关于SaltStack Master和 ...