在传统的 Java EE 开发中,我们在一个对象需要另一个或者两个以上的依赖对象才能完成某一个功能或者业务逻辑时,通常需要自己写程序代码去创建或者获取。创建依赖对象的主动权以及其生命周期都掌握在该对象手里,该对象必须依赖协对象才能完成业务操作,这样使得对象间出现了高耦合,不利于测试和维护。
那如何设计出松耦合、更优良的程序呢?那就要应用到 Spring IoC 和 DI。
然而 IoC、DI 这两概念却比较晦涩,让人不太容易望文生义。
1、IoC 是什么
Ioc—Inversion of Control,即“控制反转”,它不是什么技术,而是一种设计思想。
何为控制反转?
就是说 创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了 IoC 容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC 容器,依赖关系就变了,原先的紧密的依赖关系就没了,它们都依赖 IoC 容器了,通过 IoC 容器来建立它们之间的关系。同时 Spring 也控制着所有被 Spring 容器控制对象的生命周期。
引用Bromon的一个例子,深刻理解何为IoC容器
通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。
2、DI 是什么
DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。
3、IOC 和 DI 有什么关系
IoC 的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过 DI 来实现的。
比如对象 A 需要一个依赖对象 B,以前我们总是要在 A 中自己编写代码来获得一个 B 对象,有了 spring 我们就只需要告诉 spring,A 中需要一个 B,甚至 B 中还需要一个依赖对象 C,至于这个 B 和 C 怎么构造,何时构造,A 不需要知道。这就是 IoC 思想。。
那如何实现呢
在系统运行时,spring 会在适当的时候制造一个 B 和 C,然后像打针一样,分别注射到 A 和 B 当中,这样就完成了对各个对象之间关系的控制。A 需要依赖 B,B 需要依赖 C 才能正常运行,而这个 B 和 C 是由 spring 注入到 A 和 B 中的,依赖注入的名字就这么来的。
相对 IoC 而言,“依赖注入”明确描述了“被注入对象依赖 IoC 容器配置依赖对象”。
PS:笔者是参考了 点击这里 这篇文章总结而来,如有错误,多多指教!