分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846

IoC是什么


IoCInversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制

如何理解好 IoC 呢?理解好 IoC 的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

  ●谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由 IoC 容器来控制对 象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)

  ●为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了

  用图例说明一下,传统程序设计如图,都是主动去创建相关对象然后再组合起来:


传统应用程序示意图

  当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图所示:


有IoC/DI容器后程序结构示意图

IoC能做什么


IoC 不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了 IoC 容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是 松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

其实 IoC 对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了

IoC 很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找

IoC和DI


DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

  ●谁依赖于谁:当然是应用程序依赖于IoC容器

  ●为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源

  ●谁注入谁:很明显是 IoC 容器注入应用程序某个对象,应用程序依赖的对象

  ●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)

IoC 和 DI 有什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对 IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”

看过很多对Spring的Ioc理解的文章,好多人对Ioc和DI的解释都晦涩难懂,反正就是一种说不清,道不明的感觉,读完之后依然是一头雾水,感觉就是开涛这位技术牛人写得特别通俗易懂,他清楚地解释了 IoC(控制反转) 和 DI(依赖注入)中的每一个字,读完之后给人一种豁然开朗的感觉。我相信对于初学Spring框架的人对 Ioc 的理解应该是有很大帮助的。

技术杂谈 | 分享Iteye的开涛对IoC的精彩讲解相关推荐

  1. 分享Iteye的开涛对Ioc的精彩讲解

    转自:http://www.cnblogs.com/xdp-gacl/p/4249939.html 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring ...

  2. 开涛的博客—公众号:kaitao-1234567,一如既往的干货分享

    开涛的博客开涛的博客http://jinnianshilongnian.iteye.com/

  3. 《跟开涛学SpringMVC》学习笔记

    一 背景: 原来用spring那会,还是低版本没有注解,配置一堆bean.后来一直没怎么用过,也就疏忽了,现在整理项目的时候,给前端app提供rest接口,就是用springMVC实现的,接触整理下有 ...

  4. 计算机科学与技术杂谈

    计算机科学与技术杂谈 2008-08-18 11:13 [注]转载的文章,粗略看了看,觉得不错. 计算机科学与技术这一门科学深深的吸引着我们这些同学们,上应用数学系已经有近三年了,自己也做了一些思考, ...

  5. 技术杂谈 之 室内导航

    技术杂谈 之 室内导航 这两年AI很火热,各种无人驾驶.机器人.无人机层出不穷,新零售也是AI的一个很热的方向.AI与新零售的结合现在也有不少案例了,比如京东X无人超市.超嗨的智能购物车等等.在大型百 ...

  6. 第一章 Web MVC简介 —— 跟开涛学SpringMVC

    第一章 Web MVC简介 -- 跟开涛学SpringMVC Web MVC简介 1.1.Web开发中的请求-响应模型: 在Web世界里,具体步骤如下: 1.  Web浏览器(如IE)发起请求,如访问 ...

  7. 跟开涛学 SpringMVC

    http://jinnianshilongnian.iteye.com/blog/1752171 电子书下载链接 请登录后下载 在线版目录 第一章 Web MVC简介 第二章 Spring MVC入门 ...

  8. 亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统

    亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统 1.高并发原则 1.1 无状态 1.2 拆分 1.3 服务化 1.4 消息队列 1.5 数据异构 1.6 缓存银弹 1.7 并发化 2 高可用原 ...

  9. 学习总结1-跟开涛学SpringMVC

    参考:http://jinnianshilongnian.iteye.com/blog/1593441 看完开涛的第一讲我的理解: Spring是一组的框架,稍后学习之后再写总结.现在介绍Spring ...

最新文章

  1. select * 和 select 所有字段的区别
  2. 10个经典又容易被人疏忽的JVM面试题
  3. 职业大揭秘,算法攻城狮在日常工作中都干了些啥?
  4. SpringSecurityOAuth使用JWT Token实现SSO单点登录
  5. 图像处理理论(八)——Meanshift, Camshift, Optical flow
  6. 根据一级分类查询所有子级分类
  7. Android之Bitmap的内存优化方案总结
  8. 【Kafka】kafka命令kafka-console-consumer.sh
  9. Springboot+WebSocket
  10. BeanFactory的实现原理
  11. 你想要的宏基因组-微生物组知识全在这(2022.8)
  12. 随着稻香河流继续奔跑 ——致2016
  13. ie10不适用计算机,无发安装KB2731771,提示此更新不适用于您的计算机。无法安装ie10,不知道是否跟这个更新无 - Microsoft Community...
  14. ESXi5安装vib格式驱动
  15. TI Davinci 五年七宗罪
  16. 服务器系统开机提示0xc000007b,示例电脑开机出现0xc000007b蓝屏解决办法
  17. 国产设计软件都有哪些,国产设计工具推荐
  18. Java中的Dao是什么意思?
  19. C# 特性Description的值的获取
  20. centos 7系统Give root password for maintenance解决办法

热门文章

  1. 【MIME协议】base64编码与quoted-printable编码
  2. 短代码 html,WooCommerce 默认提供的简码短代码
  3. 中医针灸学综合练习题库【3】
  4. 如何用python绘制等边三角形_python叠加等边三角形的代码编写方法
  5. 养成良好的编程习惯-一个库一个文件夹
  6. 互联网医疗十大公司排名
  7. 外卖CPS小程序部署指南,个人获取美团外卖小程序跳转链接
  8. linux禁用ssh弱加密算法,ssh弱加密算法漏洞修复
  9. Java 方法重写与重载的区别 示例 重载多数相加求和 重写toString()和equals()
  10. 微信二次开发资源整理