IOC
Inversion Of Control即控制反转,不是一种技术,而是一种设计思想。在java开发中,ioc意味着你将设计好的对象交给容器去控制,而不是传统的在你的对象内部直接控制。 理解ioc必须明白谁控制谁,怎么反转的,为什么叫反转。
谁控制谁
在传统的javase中,我们直接在对象内部通过new方法创建对象,是程序主动去创建依赖对象,而IOC是有专门的容器去创建对象的,也就是IOC容器管理控制对象的创建,即IOC容器控制对象,控制外部资源的获取。
反转
传统应用程序中对象获取依赖对象的方式,通过程序员自己在对象中创建并获取依赖对象,而反转则是IOC容器帮我们查找并注入依赖对象,对象只是被动的接受依赖对象的注入。
IOC能做什么
ioc不是一种技术,只是一种思想,一个重要的面向对象编程法则。他指导我们写出高内聚低耦合的代码,由于对象之间的松散耦合可以使得程序方便测试,同时也很方便代码的复用。最主要的是使得整个程序变得更加灵活。
DI
Dependency Injection 即依赖注入。组件之间的依赖关系由容器在运行期决定,形象的说就是由容器动态的将一个依赖关系注入到组件中去,依赖注入的目的不是为了给软件系统带来更多的功能,而是为了提升组件重用效率,并为系统搭建一个灵活可扩展的平台。
理解DI的关键
1、谁依赖谁:应用程序依赖于ioc容器。
2、为什么需要依赖:应用程序需要ioc容器提供对象需要的外部资源。
3、谁注入谁:ioc容器注入应用程序所需要的外部对象,即应用程序依赖的对象。
4、注入了什么:应用程序所需要的外部对象。
IoC和DI有什么关系呢?
其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。
详解ioc
首先想说说IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系。这是什么意思呢,举个简单的例子,我们是如何找女朋友的?常见的情况是,我们到处去看哪里有长得漂亮身材又好的mm,然后打听她们的兴趣爱好、qq号、电话号、ip号、iq号………,想办法认识她们,投其所好送其所要,然后嘿嘿……这个过程是复杂深奥的,我们必须自己设计和面对每个环节。传统的程序开发也是如此,在一个对象中,如果要使用另外的对象,就必须得到它(自己new一个,或者从JNDI中查询一个),使用完之后还要将对象销毁(比如Connection等),对象始终会和其他的接口或类藕合起来。
那么IoC是如何做的呢?有点像通过婚介找女朋友,在我和女朋友之间引入了一个第三者:婚姻介绍所。婚介管理了很多男男女女的资料,我可以向婚介提出一个列表,告诉它我想找个什么样的女朋友,比如长得像李嘉欣,身材像林熙雷,唱歌像周杰伦,速度像卡洛斯,技术像齐达内之类的,然后婚介就会按照我们的要求,提供一个mm,我们只需要去和她谈恋爱、结婚就行了。简单明了,如果婚介给我们的人选不符合要求,我们就会抛出异常。整个过程不再由我自己控制,而是有婚介这样一个类似容器的机构来控制。Spring所倡导的开发方式就是如此,所有的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转