spring Ioc/DI的理解
学习spring的童鞋都知道,spring中有两个非常重要的点,Ioc(控制反转)与DI(依赖注入),对于初级玩家来说,这两个概念可能有点模棱两可的感觉,今天就谈下自己的一点理解,不足请多多指教!!! 本文人力资源局的例子只为方便理解,无任何指向意义
一、Ioc是什么?
控制反转(Inversion of Control,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。当然,这是百度说的,看了还是不懂,so,复杂的东西简单说
控制反转三个问题:1、谁控制谁;
2、控制了什么;
3、怎么就反转了;
第一个问题:谁控制谁,Ioc其实可以把它当做一个容器,一个存储对象的容器,我们开发中的对象都可以交给spring Ioc容器做一个统一的规范管理,就好像是我们每个人都有自己的简历,全部交给人力资源局来管理,Ioc容器就充当一个人力资源局的角色;
第二个问题:控制了什么,既然我们的开发之中的对象已经全部交由Ioc容器来管理了,那我们在获取对象的时候就得由Ioc容器来给我们提供,那么然Ioc容器也就控制了我们实例对象的获取权,就好像我们要去取得一个人的档案,就得由人力资源局提供,人力资源局控制了我们档案的提取;
第三个问题:怎么就反转了,其实说白了就是一个控制权的反转,好比我们需要一个其他人的档案,我们直接去找这个人家要过来,这个事情是我们来做,控制权就在我们手里(程序过程就是classA需要一个classB的实例,就在A类中直接new 一个B的实例来使用),但是现在我们不直接向这个人所要档案了,我们去向资源局去索要这个人的档案,由人力局把档案给我们(程序过程就是classA需要classB的一个实例,然后告诉Ioc容器,我需要B的实例,你给我一个,然后容器把B的实例给classA),现在,弄档案这个事情是资源局在做而不是我们了,这个弄档案的事情的控制权到了资源局手里而非我们自己去弄,Ioc的职责就像是资源局,我们在使用spring框架开发时,就把我们的对象交由spring Ioc容器来管理,我们对实例对象的控制权利发生了一个反转;
二、Ioc容器能干什么,为什么要把对象的控制权交给容器来管理?
Ioc是一种设计思想,帮助我们实现程序之间的解耦,设计出耦合性更低更优良的的程序,传统的开发模式在程序类的内部主动的依赖对象(new Object)来实现注入,从而使的类之间高度耦合,有了Ioc容器之后,我们可以把对象的控制权交给容器,让容器为我们创建管理对象,这样,对象之间耦合度变低,程序的架构体系也会更加的灵活;
三、Ioc与DI
看过很多的博客都把Ioc跟DI分开来说,我个人感觉他们的紧密程度非常之大,像是一条工作链必不可少的部分,工作模式又是相辅相成;
什么是DI:依赖注入,在容器运行的时候,扫描所有的依赖关系,并为之动态的注入对应的依赖关系,比如,我们需要某人的档案了,就给人力资源局发一个通知,告诉他我需要领取xxx的档案,然后资源局就把档案给你送过来,我们领取档案的过程就是DI(依赖注入)
DI的几个问题:、谁依赖谁
2、谁注入了谁
3、注入了什么
第一个问题:1、谁依赖谁,从我们领取档案的流程来看就知道我们依赖于人力资源局,也就是说程序依赖于Ioc容器
第二个问题:2、谁注入了谁,人力资源局把档案给我们,也就是说Ioc容器把对象注入了程序之中(这个过程就是依赖注入)
第三个问题:3、注入了什么,我们向人力资源局要档案然后给了我们,就是容器把我们依赖的对象注入了程序
Ioc与DI的关系:他两的关系就像是同一个问题的不同角度的描述,总是那么的紧密相连,理解过上边的自然心里就清晰了
四、总结
看到这里,其实Ioc容器就是为我们提供一个公共的管理平台,管理我们对象之间的依赖关系,我们需要什么就向容器要,容器之中如果要就会给我们,我们拿过来直接用,而不用去考虑对象什么时候创建,什么时候销毁,只管用就行了,是不是方便了很多
以上就是我对Ioc跟DI的一些理解,不足之处多多指教!
最新文章
- CentOS安装LNMP环境的基础组件
- 自定义路径创建Cocos2d-x项目
- 深入理解javascript作用域系列第三篇——声明提升(hoisting)
- CSS z-index 属性的使用方法和层级树的概念
- CSRF攻击原理以及防御
- Java API —— Random类
- 【Zookeeper学习】Zookeeper-3.4.6安装部署
- HW5.35
- javascript 键值对
- 在MVC中利用uploadify插件实现上传文件的功能
- jQuery 1.10.2 and 2.0.3 Released
- Git和Github的配合使用
- Warning: connect.static is not a function
- 暑假练习赛 006 A Vanya and Food Processor(模拟)
- 实现简单的printf函数
- 【AGC015E】Mr.Aoki Incubator DP
- Hash table: why size should be prime?
- VC字符串转换常用函数
- _viewstart.cshtml的作用
- (转)SQL Server 列转行
热门文章
- python函数:函数参数、对象、嵌套、闭包与名称空间、作用域
- zabbix 3.2.2 server端添加客户端主机配置 (四)
- 卸载TensorFlow
- 11.tensorboard网络结构
- zoj 4122 Triangle City 2019山东省赛J题
- 从零开始学会GAN 0:第一部分 介绍生成式深度学习(连载中)
- 【安徽集训】Emerald
- BZOJ 2242 / Luogu P2485 [SDOI2011]计算器 (BSGS)
- 2017";百度之星";程序设计大赛 - 初赛(A) [ hdu 6108 小C的倍数问题 ] [ hdu 6109 数据分割 ] [ hdu 6110 路径交 ] [ hdu 6112 今夕何夕 ] [ hdu 6113 度度熊的01世界 ]
- 对Webpack 应用的研究-----------------引用