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这两个概念是模糊不清的,是很难理解的,今天和大家 ...
随机推荐
- java HttpServletRequest 重复流读取
在用reset接口的时候,常常会使用request.getInputStream()方法,但是流只能读取一次,一旦想要加上一个过滤器用来检测用户请求的数据时就会出现异常. 在过滤器中通过流读取出用 ...
- shell脚本,通过传参求斐波那契数列如(0,1,1,2,3,5,8,13..........)
[root@localhost wyb]# cat fibo.sh #!/bin/bash #斐波那契数列 ,,,,,,, > file >> file count=$ for i ...
- 初涉trie
trie:字符串算法中的重要“数据结构” 什么是trie trie就是利用字符串的公共前缀所建成的树. 众所周知树是有很多很好的性质的,于是trie可以结合其他知识点做一些有趣的事情. trie的例题 ...
- Python 基本数据类型 (一) - 整数
帮助文档网址: https://docs.python.org/3.7/tutorial/introduction.html 待补充
- LeetCode(121) Best Time to Buy and Sell Stock
题目 Say you have an array for which the ith element is the price of a given stock on day i. If you we ...
- http协议工作原理(转)
WWW是以Internet作为传输媒介的一个应用系统,WWW网上最基本的传输单位是Web网页.WWW的工作基于客户机/服务器计算模型,由Web 浏览器(客户机)和Web服务器(服务器)构成,两者之间 ...
- 【01】报错:webpack 不是内部或不可执行命令
[02] webpack 不是内部或不可执行命令 一般来安装完之后是可以直接执行的你可以执行 webpack -v 或者是 webpack --help 这样的就是正确的,我的问题的解决办法是 将 ...
- joyoi1935 「Poetize3」导弹防御塔
#include <iostream> #include <cstring> #include <cstdio> #include <queue> #i ...
- PTA 09-排序1 排序 (25分)
题目地址 https://pta.patest.cn/pta/test/15/exam/4/question/720 5-12 排序 (25分) 给定NN个(长整型范围内的)整数,要求输出从小到大 ...
- [luoguP2221] [HAOI2012]高速公路(线段树)
传送门 考虑每一段对答案的贡献 用每一段的左端点来表示当前这一段,那么区间就变成了[1,n-1] 如果询问区间[l,r],其中一个点的位置为x,则它对答案的贡献为(x-l)*(r-x)*s[x](s[ ...