什么是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. WINDOWS-API:取得系统语言种类-GetOEMCP

    GetOEMCP VB声明 Declare Function GetOEMCP Lib "kernel32" Alias "GetOEMCP" () As Lo ...

  2. cdlinux

    xset q xset s 6000 xset -dpms ntpdate time.nist.gov date

  3. Arch Linux 天坑

    https://wiki.archlinux.org/index.php/Samba_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87) samba  gui客户端 smb4 ...

  4. shell脚本,一个经典题目。

    [root@localhost wyb]# cat zhuijiu.sh #!/bin/bash #.写一个脚本执行后,输入名字,产生随机数01-99之间的数字. #.如果相同的名字重复输入,抓到的数 ...

  5. swift-通知的基本使用

    swift-通知的基本使用   //通知的使用 1.发通知.(以这条通知为例,通知名字:nickNameNotification 通知参数:title) NSNotificationCenter.de ...

  6. Noip2018 考前准备

    目录 基础算法 二分 模拟(未补) 高精(未学习) 搜索(未补) 排序 图论 树的直径 树的重心 最短路算法 Spfa Dijkstra Floyd 最小生成树 kruskal 数论 线性筛 线性筛素 ...

  7. OS复习

    提纲 一 操作系统的定义,各章节名词定义. 分时多道- OS四大特征,五大功能. 二 进程 创建终止挂起激活 PCB 原语:创建终止挂起激活唤醒 互斥和同步,临界资源,临界区 信号量的基础概念,受保护 ...

  8. (13)zabbix External checks 外部命令检测

    1.  概述 zabbix server运行脚本或者二进制文件来执行外部检测,外部检测不需要在被监控端运行任何agentd item key语法如下: ARGUMENT DEFINITION scri ...

  9. Linux-实现双主模型的nginx的高可用

    实现双主模型的ngnix高可用(一) 准备:主机7台 client: 172.18.x.x 调度器:keepalived+nginx 带172.18.x.x/16 网卡 192.168.234.27 ...

  10. 纯 CSS 创作一个表达怀念童年心情的条纹彩虹心特效

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/QxbmxJ 可交互视频教 ...