IoC与DI (转载)

(本文转自梦想风暴的blog)

一个朋友发了封mail问了几个问题,其中的一个是关于IoC和DI的:
Inversion of Control和Dependency Injection 是什么关系,我认为两个词代表的是同一个意思,只是两种不同的表示,对吗?

下面是我对这个问题的一些理解。
准确的说,IoC和DI并不相同,这一点从字面上就可以看出,否则,它们可以叫一个名字。^_^

理解IoC,我们需要知道Control是什么,它又是怎样被Inversion的。其实,IoC是用来说明“程序库”和“框架”区别的最好证据。在使用程序库的时候,控制权是掌握在我们手中的,我们编写的代码调用程序库的实现,完成相应的功能,想想我们使用JDK的情况。使用框架的时候,控制权则掌握在框架手中,我们的代码最终是由框架调用,一个常见的例子是Servlet,我们编写的Servlet代码是放在整个Servlet的框架中,由Web容器进行调用。这就是差异所在。我们更习惯于自己掌控一切,因此,对框架掌握控制权的这种情况,我们用“Inversion”来形容,这也是Martin Fowler在那篇给DI正名的文章中提到,所有框架都是IoC的原因。

Spring的核心容器是一个框架,所以,我们可以说它是IoC,但是就如前面所说,每个框架都有IoC,所以,仅仅用IoC是不足以说明一切的。Spring核心容器完成的是组件组装的过程,这是它和其它普通框架区别最为显著的地方。如果说用IoC描述这个框架,那么,这里所指的Control实际上是组件的组装过程。

站在Spring核心容器的层面上看,它完成组装过程是把组件所依赖的零部件给组件安装上去。站在单个组件层面上看,它所需要的零部件是由外部给它安装的,这个过程就像是把“Dependency”这管药水用注射器“Injection”到组件的身体中去,所以,我们称之为“Dependency Injection”。

完成组件组装的容器也不只是注入一种形式,还有一种常见的方式是“Dependency Lookup”,即每个组件自己去查找自己所需要的内容。至于到哪去找,也有不同的实现方式,有固定到某个地方(比如使用静态方法),有把查找点通过DI的方式注入进来等等。

Martin Fowler的文章已经很清楚的解释了IoC和DI这两个概念,我们只需要去细细品味。

时间: 2024-09-19 20:33:24

IoC与DI (转载)的相关文章

如何深入理解DIP、IoC、DI及IoC容器

前言 对于大部分小菜来说,当听到大牛们高谈DIP.IoC.DI以及IoC容器等名词时,有没有瞬间石化的感觉?其实,这些"高大上"的名词,理解起来也并不是那么的难,关键在于入门.只要我们入门了,然后循序渐进,假以时日,自然水到渠成. 好吧,我们先初略了解一下这些概念. 依赖倒置原则(DIP):一种软件架构设计的原则(抽象概念). 控制反转(IoC):一种反转流.依赖和接口的方式(DIP的具体实现方式). 依赖注入(DI):IoC的一种实现方式,用来反转依赖(IoC的具体实现方式). Io

对IOC和DI的理解

首先说一下什么是IOC和DI,IOC是Inversion of Control(控制反转)的简写,DI是Dependency Injection(依赖注入)的简写,martinfowler对IOC的解释为:"Inversion of control is a common characteristic of frameworks, so saying that these lightweight containers are special because they use inversion

对依赖倒置原则(DIP)及Ioc、DI、Ioc容器的一些理解(转)

所谓依赖倒置原则(Dependence Inversion Principle)就是要依赖于抽象,不要依赖于具体.简单的说就是要求对抽象进行编程,不要对实现进行编程,这样就降低了客户与实现模块间的耦合,并由此引申出IoC.DI以及Ioc容器等概念.         面向过程的开发,上层调用下层,上层依赖于下层,当下层剧烈变动时上层也要跟着变动,这就会导致模块的复用性降低而且大大提高了开发的成本.   面向对象的开发很好的解决了这个问题,一般情况下抽象的变化概率很小,让用户程序依赖于抽象,实现的细

Spring学习笔记之基础、IOC、DI(1)

0.0 Spring基本特性 Spring是一个开源框架:是基于Core来架构多层JavaEE系统 1.0 IOC 控制反转:把对象的创建过程交给spring容器来做. 1.1 applicationContext.xml beans 存放了很多个类 把一个类放入到spring容器中,该类就是bean 一个bean就是描述一个类 id就是标示符 命名规范:类的第一个字母变成小写,其他的字母保持不变 class为类的全名 1.2 别名,模块别名 <alias name="helloWorld

对DIP IoC DI的理解与运用

DIP,IoC,DI基本概念 依赖倒置原则(DIP,Dependency Inverse Principle):强调系统的"高层组件"不应当依赖于"底层组件",并且不论是"高层组件"还是"底层组件"都应当依赖于抽象.抽象不应当依赖于实现,实现应当依赖于抽象. 依赖(Dependency):组件A如果:①持有B的引用,②调用B的方法,③创建(new)B,则A对B产生依赖. 控制(Control):A依赖B,则B拥有"控

再谈angularjs DI(Dependency Injection)

在前面已经介绍了关于angularjs,以及扩展了一些jQuery ui的一些组件为angularjs的directive.在这里应进口007 在上 篇留言我们来看看在angularjs中的DI特性. DI:依赖注入,是一种软件设计模式,应DIP依赖倒置原则,描述组件之间 高层组件不应该依赖于底层组件.依赖倒置是指实现和接口倒置,采用自顶向下的方式关注所需的底层组件接口,而不是其实现 .其应用框架则为IOC,在.net中有很多我们熟悉的IOC框架,如Unity,Castle windsor,Ni

我要造轮子之IoC和依赖注入

1.前言 因为这是我设想要写的一系列文章的第一篇.所以我先说明一下我为什么要重复造轮子. 在这里造轮子的目的不是为了造出比前人更出色的轮子来,而是通过造轮子,学习轮子内部的结构及相关原理.甚至去模仿前人轮子上的优点,吸收这些优点. 这一系列文章初步估计应该包括:IoC和依赖注入.AOP.ORM.Servlet容器(tomcat)等. 2.IoC和依赖注入的概念 Inverse of Control,控制反转. IoC主要功能是依赖关系的转移.应用的本身不负责依赖对象的创建和维护,而是由第三方容器

谈谈对Spring IOC的理解

学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC .DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC的理解以及谈谈我对Spring Ioc的理解. 一.分享Iteye的开涛对Ioc的精彩讲解 首先要分享的是Iteye的开涛这位技术牛人对Spring框架的IOC的理解,写得非常通俗易懂,以下内容全部来自原文,原文地址:http://jinniansh

spring的IOC

问题描述 真没感觉IOC,有什么用,除了少写点代码.求大神解惑. 解决方案 解决方案二:SpringIOC,依赖注入,通俗的说就是get.set,即由容器动态地将某种依赖关系注入到组件之中.这样减少了代码之间的耦合度,使程序变得更灵活.变得更具有可扩展性和可维护性.方面此时的开发和未来的维护~总而言之,Spring很强大~~懂了么?解决方案三:而且,IOC实现配置文件配置,方便修改哦,以后改动就不用改动代码,只需修改配置文件就ok--!解决方案四:建议楼主先看看基础的设计,看看IOC到底是什么,