技术杂谈 | 分享Iteye的开涛对IoC的精彩讲解
分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinnianshilongnian.iteye.com/blog/1413846
IoC是什么
IoC
—Inversion 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的精彩讲解相关推荐
- 分享Iteye的开涛对Ioc的精彩讲解
转自:http://www.cnblogs.com/xdp-gacl/p/4249939.html 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring ...
- 开涛的博客—公众号:kaitao-1234567,一如既往的干货分享
开涛的博客开涛的博客http://jinnianshilongnian.iteye.com/
- 《跟开涛学SpringMVC》学习笔记
一 背景: 原来用spring那会,还是低版本没有注解,配置一堆bean.后来一直没怎么用过,也就疏忽了,现在整理项目的时候,给前端app提供rest接口,就是用springMVC实现的,接触整理下有 ...
- 计算机科学与技术杂谈
计算机科学与技术杂谈 2008-08-18 11:13 [注]转载的文章,粗略看了看,觉得不错. 计算机科学与技术这一门科学深深的吸引着我们这些同学们,上应用数学系已经有近三年了,自己也做了一些思考, ...
- 技术杂谈 之 室内导航
技术杂谈 之 室内导航 这两年AI很火热,各种无人驾驶.机器人.无人机层出不穷,新零售也是AI的一个很热的方向.AI与新零售的结合现在也有不少案例了,比如京东X无人超市.超嗨的智能购物车等等.在大型百 ...
- 第一章 Web MVC简介 —— 跟开涛学SpringMVC
第一章 Web MVC简介 -- 跟开涛学SpringMVC Web MVC简介 1.1.Web开发中的请求-响应模型: 在Web世界里,具体步骤如下: 1. Web浏览器(如IE)发起请求,如访问 ...
- 跟开涛学 SpringMVC
http://jinnianshilongnian.iteye.com/blog/1752171 电子书下载链接 请登录后下载 在线版目录 第一章 Web MVC简介 第二章 Spring MVC入门 ...
- 亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统
亿级流量网站架构核心技术 跟开涛学搭建高可用高并发系统 1.高并发原则 1.1 无状态 1.2 拆分 1.3 服务化 1.4 消息队列 1.5 数据异构 1.6 缓存银弹 1.7 并发化 2 高可用原 ...
- 学习总结1-跟开涛学SpringMVC
参考:http://jinnianshilongnian.iteye.com/blog/1593441 看完开涛的第一讲我的理解: Spring是一组的框架,稍后学习之后再写总结.现在介绍Spring ...
最新文章
- select * 和 select 所有字段的区别
- 10个经典又容易被人疏忽的JVM面试题
- 职业大揭秘,算法攻城狮在日常工作中都干了些啥?
- SpringSecurityOAuth使用JWT Token实现SSO单点登录
- 图像处理理论(八)——Meanshift, Camshift, Optical flow
- 根据一级分类查询所有子级分类
- Android之Bitmap的内存优化方案总结
- 【Kafka】kafka命令kafka-console-consumer.sh
- Springboot+WebSocket
- BeanFactory的实现原理
- 你想要的宏基因组-微生物组知识全在这(2022.8)
- 随着稻香河流继续奔跑 ——致2016
- ie10不适用计算机,无发安装KB2731771,提示此更新不适用于您的计算机。无法安装ie10,不知道是否跟这个更新无 - Microsoft Community...
- ESXi5安装vib格式驱动
- TI Davinci 五年七宗罪
- 服务器系统开机提示0xc000007b,示例电脑开机出现0xc000007b蓝屏解决办法
- 国产设计软件都有哪些,国产设计工具推荐
- Java中的Dao是什么意思?
- C# 特性Description的值的获取
- centos 7系统Give root password for maintenance解决办法
热门文章
- 【MIME协议】base64编码与quoted-printable编码
- 短代码 html,WooCommerce 默认提供的简码短代码
- 中医针灸学综合练习题库【3】
- 如何用python绘制等边三角形_python叠加等边三角形的代码编写方法
- 养成良好的编程习惯-一个库一个文件夹
- 互联网医疗十大公司排名
- 外卖CPS小程序部署指南,个人获取美团外卖小程序跳转链接
- linux禁用ssh弱加密算法,ssh弱加密算法漏洞修复
- Java 方法重写与重载的区别 示例 重载多数相加求和 重写toString()和equals()
- 微信二次开发资源整理