Spring - 依赖注入和控制反转

来源:互联网 发布:网络歌曲今夜不醉不归 编辑:程序博客网 时间:2024/05/22 02:29

Spring框架2个特性,依赖注入(Dependency Injection ,DI)和面向切面编程(aspect-oriented programming,AOP),下面稍微整理下自己对于DI的学习笔记以及简单理解。


依赖注入(Dependency Injection ,DI)和控制反转(Inversion of Control,IoC)

相信大多数人在网上查找关于Spring的时候,都不可避免的看到除了依赖注入之外还有一个叫做控制反转的东西,我也不例外,既然看到一个和依赖注入那么相关的词汇,去了解下它到底是什么,又和依赖注入是怎么样的一种关系,也是很有必要的,至少多了解点总没有错。这里我还是要借鉴下论坛上那些大神们的理解,再加上自己的理解,整理下。


初次接触Spring的话,第一感觉总觉得DI和IoC概念很模糊,感觉就是一个东西,依赖注入差不多就理解了,干嘛还去创造一个控制反转这个概念?讲道理,我那会也这样懵逼过...

控制反转(Inversion of Control,IoC),控制反转,不是什么技术,而是一种设计思想,所谓IoC,对于Spring框架来说,就是由Spring来负责控制对象的生命周期和对象间的关系,在应用了Spring的Java开发中,IoC意味着你将设计好的对象交给Spring容器控制,而不是传统的在你对象内部去直接控制。既然叫做控制反转,字面意思上,可能就有一连串问题,谁控制了谁?控制了什么?怎么控制的?反转又是啥情况?反转了什么?

1.谁控制谁?控制了什么?

在传统的Java开发中,一般都是在对象内部通过new来创建别的对象,是我们自己主动去创建当前对象所以来的对象,而IoC专门有一个容器来创建对象,意思就是现在由IoC这个东西来负责创建对象,或是说控制对象的创建。控制了什么,控制的是外部资源的获取(不仅仅是对象,当然还有其他),控制了对象创建的方式。

2.反转是啥?有没有正转?什么东西反转了?

传统的应用程序都是我们在自己的对象中主动控制来获取所依赖的对象,即每个对象负责管理与自己相互协作的对象(即它所依赖的对象)的引用,这就是正转,这不出奇的会导致高度耦合和难以编写测试代码。而反转,就是现在是容器来负责创建以及注入依赖对象。容器来负责查找以及注入依赖对象,对象只是被动的接受依赖对象,所以是这种获取依赖对象的方式被反转了。

小结:传统方式,当前对象需要哪些相互协作的对象的引用,都是自己去创建来获取。通过IoC容器,容器会自己分析是否有需要依赖的对象,如果有,容器会将这些依赖对象获取到,注入给当前对象。


IoC做了什么工作?

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

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

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


再来说说依赖注入

讲道理,我码上面文字的时候,我感觉一直在骗自己,心里想着是我这里是阐述IoC的,可是另一个声音却在说,这不就是依赖注入的思想吗?鉴于水平有限,我一直在进行着天人交战...可能随着对Spring了解的深入,自己会在不经意间,对这些概念理所应当的了解清晰吧。

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

简单理解依赖注入,我们也不妨按照上面的方式去探究,就字面意思来说:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么?”

1.谁依赖谁

是应用程序依赖IoC容器,因为现在的依赖关系是交给IoC来管理了。

2.为什么需要依赖

为了简化开发也好,为了降低耦合也好,通过IoC容器来提供对象需要的外部资源,是比传统方式要更优秀,有更好的解决方案,我们自然可以摒弃原始的方式了。

3.谁注入谁

IoC容器注入应用程序依赖的对象。

4.注入了什么

注入某个对象所需要的外部资源(包括对象、资源、常量数据)。


下面终于来到了正题,IoC和DI到底是什么关系!?

一句话先概括:依赖注入和控制反转是同一种概念的不同角度的描述。

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


以上这么多,还算详细的介绍,自然不是我现阶段所能写出来的文章,我做的就是去顺着思维去理解,或者是加深下理解,主要还是借鉴论坛上一些大神们理解叙述,在这里向他们也表达感谢,“如果说我比别人看得更远些,那是因为我站在了巨人的肩上”。

2016年7月23日17:25:18



0 0
原创粉丝点击