IOC基本理解
什么是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基本理解的更多相关文章
- IOC的理解
转载http://www.cnblogs.com/xdp-gacl/p/4249939.html 很不错的文章,虽说是java的,但是.net也通用,所以复制一分,拿来看看挺不错的. 1.1.IoC是 ...
- 谈谈对Spring IOC的理解(转)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 谈谈对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- Spring系列之谈谈对Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IOC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 谈谈对Spring IOC的理解【转】
学习过Spring框架的人 一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大 ...
- Spring IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理 ...
- 谈谈对Spring IOC的理解(转载)
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- C# 一个初学者对 依赖注入 IOC 的理解( 含 Unity 的使用)
通过 人打电话 来谈谈自己对IOC的理解 版本1.0 public class Person { public AndroidPhone Phone { get; set; } public void ...
- 浅析对spring中IOC的理解
学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
- 依赖注入(DI)和控制反转(IOC)的理解,写的太好了。
学习过spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家 ...
随机推荐
- 数据库:SQL Server自增长列的编号
SQL Server表中的自动编号ID重新开始排列 说法一: 有两种方法: 方法1: truncate table 你的表名 --这样不但将数据删除,而且可以重新置位identity属性的字段. 方法 ...
- 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 ...
- Python IDE推荐
八个最佳Python IDE 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs Python是一种功能强大.语言简洁的编程语言.本文向大家推荐8个适合pyt ...
- 在Xcode中编辑运行 Python 脚本
http://www.zhihu.com/question/19872198 打开Xcode,File->New->Project选中OS X下的Other点击External Build ...
- React项目搭建及依赖安装
一.前提 首先保证node.js已安装完成... 安装完成后,打开cmd命令行,输入 node -v 和 npm -v 来查看版本号,如果显示则安装完成. 二.安装react脚手架 在cmd命令行中输 ...
- perl学习之I/O基础
1.从标准输入进行输入<STDIN> 2.从钻石操作符进行输入<> 3.参数调用@ARGV 4.向标准输出进行输出 5.用printf进行格式化输出 1.<STDIN&g ...
- Java的9种基本数据类型以及封装类
Java的9种基本数据类型以及封装类 基本类型 大小(单位/字节) 默认值 封装类 byte 1 (byte)0 Byte short 2 (short)0 Short int 4 0 Integer ...
- PAT Basic 1027
1027 打印沙漏 本题要求你写个程序把给定的符号打印成沙漏的形状.例如给定17个“*”,要求按下列格式打印 ***** *** * *** ***** 所谓“沙漏形状”,是指每行输出奇数个符号:各行 ...
- TCP三次握手及四次挥手详解及常见面试题
https://blog.csdn.net/ZWE7616175/article/details/80432486
- win10系统中virtualbox无法安装64位系统
win10系统中virtualbox无法安装64位系统 先总结下如果想在虚拟机中安装64位的Linux系统,最好能满足这几个条件: 64位CPU 64位操作系统 64位的虚拟机软件 开启BIOS虚拟化 ...