何谓控制反转(IoC = Inversion of Control),何谓依赖注入(DI = Dependency Injection)?一直都半懂不懂,今天看到两个比喻,觉得比较形象。
IoC,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓"控制反转"的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
正在业界为IoC争吵不休时,大师级人物Martin Fowler也站出来发话,以一篇经典文章《Inversion of Control Containers and the Dependency Injection pattern》为IoC正名,至此,IoC又获得了一个新的名字:"依赖注入 (Dependency Injection)"。相对IoC 而言,"依赖注入"的确更加准确的描述了这种古老而又时兴的设计理念。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来 说,即由容器动态的将某种依赖关系注入到组件之中。
一:
再看上例中,笔记本电脑与外围存储设备通过预先指定的一个接口(USB)相连,对于笔记本而言,只是将用户指定的数据发送到USB接口,而这些数据何去何 从,则由当前接入的USB设备决定。在USB设备加载之前,笔记本不可能预料用户将在USB接口上接入何种设备,只有USB设备接入之后,这种设备之间的 依赖关系才开始形成。
对应上面关于依赖注入机制的描述,在运行时(系统开机,USB 设备加载)由容器(运行在笔记本中的Windows操作系统)将依赖关系(笔记本依赖USB设备进行数据存取)注入到组件中(Windows文件访问组件)。这就是依赖注入模式在现实世界中的一个版本。
很多初学者常常陷入"依赖注入,何用之有?"的疑惑。想来这个例子可以帮助大家简单的理解其中的含义。依赖注入的目标并非为软件系统带来更多的功能,而是 为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。将USB接口和之前的串/并、PS2接口对比,想必大家就能明白其中的意味。
二:
首先想说说IoC(Inversion of Control,控制倒转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和 对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱 好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传 统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比 如Connection等),对象始终会和其他的接口或类藕合起来。
  那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出 一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要 求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是 有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西, 你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象 都被spring控制,所以这叫控制反转。 

转载于:https://www.cnblogs.com/SingleCat/archive/2009/04/20/1439497.html

转《两个个很形象的依赖注入的比喻》相关推荐

  1. 18个实时音视频开发中会用到开源项目

    实时音视频的开发学习有很多可以参考的开源项目.一个实时音视频应用共包括几个环节:采集.编码.前后处理.传输.解码.缓冲.渲染等很多环节.每一个细分环节,还有更细分的技术模块.比如,前后处理环节有美颜. ...

  2. 技术福利:最全实时音视频开发要用到的开源工程汇总

    [转自] https://my.oschina.net/jb2011/blog/1619628 1.前言 实时音视频的开发学习有很多可以参考的开源项目.一个实时音视频应用共包括几个环节:采集.编码.前 ...

  3. 福利贴:最全实时音视频开发要用到的开源工程汇总

    1.前言 实时音视频的开发学习有很多可以参考的开源项目.一个实时音视频应用共包括几个环节:采集.编码.前后处理.传输.解码.缓冲.渲染等很多环节.每一个细分环节,还有更细分的技术模块.比如,前后处理环 ...

  4. 实时音视频聊天中超低延迟架构的思考与技术实践

    1.前言 从直播在线上抓娃娃,不断变化的是玩法的创新,始终不变的是对超低延迟的苛求.实时架构是超低延迟的基石,如何在信源编码.信道编码和实时传输整个链条来构建实时架构?在实时架构的基础之上,如果通过优 ...

  5. 实时音视频开发理论必备:如何省流量?视频高度压缩背后的预测技术

    本文引用了"拍乐云Pano"的"深入浅出理解视频编解码技术"和"揭秘视频千倍压缩背后的技术原理之本文引用了"拍乐云Pano"的&q ...

  6. 直播软件搭建音视频开发中的视频采集

    直播软件搭建音视频开发中的视频采集 前言 在直播和短视频行业日益火热的发展形势下,音视频开发(采集.编解码.传输.播放.美颜)等技术也随之成为开发者们关注的重点,本系列文章就音视频开发过程中所运用到的 ...

  7. 如何测试你的即时通讯实时音视频开发方案

    真正了解过实时音视频开发的同行都知道,实时音视频开发所需的技术储备和技能要求都是比较高的,当我们历尽折腾,自已捣鼓出的方案出声出图后,离产品化还有多远呢?为了避免出现测试不充分盲目上线导致用户体验不佳 ...

  8. 【新知实验室 三步完成Windows下实时音视频开发】

    三步完成Windows下实时音视频开发 第一步:开通产品 第二步:下载源码 第三步:编译源码 第四部:运行测试 背景介绍 实时音视频(Tencent RTC)基于腾讯21年来在网络与音视频技术上的深度 ...

  9. Android端实时音视频开发指南

    简介 yun2win-sdk-Android提供Android端实时音视频完整解决方案,方便客户快速集成实时音视频功能. SDK 提供的能力如下: 发起 加入 AVClient Channel AVM ...

  10. 顶级技术大咖,揭秘实时音视频开发的超级风口

    2021年初因为Elon Musk"带货"而走红的音频社交App Clubhouse,又以肉眼可见的速度跌落神坛,下载量从2月的960 万/月跌至4月的92万/月.不过在5月,Cl ...

最新文章

  1. 解决Sqlite UTF-8中文数据格式在DOS窗口下中文乱码
  2. 随机森林案例分析:德国银行信贷风险分析
  3. linux c ping实现
  4. 深入学习Redis(3):主从复制
  5. Python的常见几道数学运算题
  6. PAT甲级1077 Kuchiguse:[C++题解]字符串、最长公共后缀
  7. 外设驱动库开发笔记2:AD8400系列数字电位器驱动
  8. React 组件的生命周期详解
  9. 陌陌直播公益课复课 带乡村孩子“打卡”丝绸之路
  10. Deteming the User Intent of Web Search Engine
  11. python微信聊天机器人_教你用Python创建微信聊天机器人
  12. webpack3 css,webpack3之处理css文件
  13. C语言程序设计基础篇
  14. 数学建模论文注意事项
  15. mysql网上图书销售_PHP+MySQL网上书店|网上图书销售系统
  16. 3V升压5V芯片,3V升压5V电路图
  17. java 计算年龄_Java 根据出生日期计算年龄
  18. java课程心得_Java课程的感想
  19. Java筑基10-封装继承多态(重点)
  20. Android 移动网络接入点名称(APN)

热门文章

  1. void函数返回值_(*void(*)()0)() 是什么
  2. the job was canceled什么意思_这些英语短语,因为相差一个“the”导致意思大不相同!...
  3. 第一天写,希望能坚持下去。
  4. iOS 仿微信灵活添加标签
  5. python之抽象基类
  6. Linux-LNMP(静态元素不记录日志和过期时间,防盗链,解析php,代理,支持ssl)
  7. OWA登录页面显示为英文而不是中文
  8. 测试驱动开发与行为驱动开发中的测试先行方法
  9. In Gradle projects, always use http://schemas.andr
  10. QTP连接oracle