2012 依赖注入框架

以下内容来自维基百科的控制反转词条

控制反转(英语:Inversion of control,缩写为IoC),也叫做依赖注入Dependency Injection,简称DI),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度

 

起源

早在2004年,Martin Fowler就提出了“哪些方面的控制被反转了?”这个问题。他总结出是依赖对象的获得被反转了。基于这个结论,他为控制反转创造了一个更好的名字:依赖注入。许多非凡的应用(比HelloWorld.java更加优美,更加复杂)都是由两个或是更多的类通过彼此的合作来实现业务逻辑,这使得每个对象都需要,与其合作的对象(也就是它所依赖的对象)的引用。如果这个获取过程要靠自身实现,那么如你所见,这将导致代码高度耦合并且难以测试。

IoC 亦称为 “依赖倒置原理”("Dependency Inversion Principle") (Martin 2002:127)。差不多所有框架都使用了“倒置注入(Fowler 2004)技巧,这可说是IoC原理的一项应用。SmallTalk,C++, Java 或各种.NET 语言等面向对象程序语言的程序员已使用了这些原理。

控制反转是Spring Framework的核心。

应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取它所依赖的对象的引用,这个责任的反转

技术性说明

术语

Class X 依赖于 class Y 只在如下状况中成立:

  • X 拥有 Y 的控制并且在 X 中使用 Y
  • X 是 Y 的派生物
  • X 依赖于 Z,而 Z 又依赖于 Y (transitivity)

X 依赖于 Y 并不表示 Y 也依赖于 X。但如果 X 和 Y 同时依赖于对方,这种依赖性被称作 循环依赖:这时,X 无法和 Y 分开单独使用,反之亦然。如果在一个面对对象程式中拥有太多的循环依赖,这可能表示这个程式是个欠佳的设计。

打破依赖

如果类X的一个实例对象x调用了类Y的一个实例对象y的方法,那么就称类X依赖于类Y。为了打破这种依赖——“反转”,首先我们可以引入一个接口I(第三方类),接口I中声明了对象y将被对象x调用的所有方法;然后,我们对类Y稍加改造,使其实现接口I;最后,我们把在对象x中对y的调用改为对接口I中对应方法的调用。经过这番改造后,原先的X对Y的依赖关系不存在了,类X和Y现在都依赖于接口I。

这种通过引入接口I来消除类X对Y的依赖的方法,被称作“控制反转”,又叫做“依赖注入”。

需要注意的是,类Y可能还依赖于其他类。在应用反转之前,X依赖于Y,从而也间接依赖于Y所依赖的所有“其他类”。应用控制反转之后,不仅X对Y的直接依赖,且前面提到的那些所有的间接依赖也消除了。而新引入的接口I则不依赖于任何类。

IoC 的类型

Martin Fowler 将 IoC 分成三类。

  • Type 1 : 基于interface (interface injection)。Depending object 需要实作(implement) 特定 interface 以供框架注入所需物件。
  • Type 2 : 基于setter (setter injection)。Depending object 需要实现特定 setter 方法 (但不需要依赖特定interface),
  • Type 3 : 基于constructor (constructor injection)

有的框架,如Plexus 提出Type 4 IoC,以field为基础,惟此法到目前为止尚未被广泛接纳。[1]

各种框架不一定支援以上所有IoC类型。例如SpringFramework 支援Type 1、Type 2 及 Type 3 IoC,而 Plexus支援 Type 2、Type 3 和 Type 4。

控制反转应用实例

C++

  • PocoCapsule IoC and DSM framework GPL开源的,支持完全非侵入C++的控制反转(IoC)及领域特定建模(DSM)容器

Java

使用Java语言写成的程式在控制反转容器(Inversion of Control Container)里应用了控制反转(Martin 2004)。软件需要一个来自容器的物件,而容器自行建构物件和它的附属物。ATG 的 [[en:Dynamo Application Server|Dynamo 应用程式服务器]是第一个利用这途径的环境之一,近来关于这些容器的例子包含了 HiveMind、PicoContainer、Spring Framework(注意 Spring 是一个完整的企业平台,而非 IOC容器)、Apache ExcaliburSeasar 和 DPML Metro.

.NET

  • Spring.NET
  • ObjectBuilder
  • Structuremap
  • CastleProject
  • Seasar
  • Unity
  • Autofac
  • Ninject
  • LinFu Hiro
  • Nlite mini

转载于:https://www.cnblogs.com/codeyu/archive/2012/03/19/2406455.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/576553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

机器学习笔记(二十)——求解最大熵模型

一、问题的引出 最大熵模型的学习过程就是求解最大熵模型的过程。最大熵模型的学习可以形式化为约束最优化问题。 对于给定的训练数据集T{(x1,y1),(x2,y2),…,(xn,yn)}及特征函数fi(x,y),i1,2,…,n,最大熵模型的学习等价于约束最优化问题: maxP∈C…

ElasticSearch前缀匹配查询和范围查询(中文检索)

GET /lib4/user/_search {"query": {"match_phrase_prefix": {"name": {"query": "赵"}}} } GET /lib4/user/_search {"query": {"prefix": {"name": "赵"}} }范围查询 GET /lib4…

系统管理员必须知道的PHP安全实践

系统管理员必须知道的PHP安全实践 PHP是一种开源服务器端脚本语言,应用很广泛。Apache web服务器提供了这种便利:通过HTTP或HTTPS协议, 访问文件和内容。配置不当的服务器端脚本语言会带来各种各样的问题。所以,使用PHP时要小心。…

ElasticSearch模糊查询(中文检索)

# "*" 表示匹配任意字符 GET /lib4/user/_search {"query": {"wildcard": {"name": "赵*"}} }# "?" 表示匹配任意一个字符 GET /lib4/user/_search {"query": {"wildcard": {"name&quo…

最优化学习笔记(十四)——共轭梯度法

共轭梯度法不需要预先给定Q共轭方向,而是随着迭代的进行不断产生Q共轭方向。在每次的迭代中,利用上一个搜索方向和目标函数在当前迭代点的梯度向量 之间的线性组合构造一个新的方向,使其与前边已经产生的搜索方向组成Q共轭方向。对于一个n维二…

ElasticSearch filter查询

学习查询之前,我还是老规矩,先准备数据 #Filter查询 #filter是不计算相关性的,同时可以cache.因此,filter速度要快于query. POST /lib5/items/_bulk {"index":{"_id": 1}} {"price": 40,"ite…

SQL Server 2005中的分区表(四):删除(合并)一个分区

在前面我们介绍过如何创建和使用一个分区表,并举了一个例子,将不 同年份的数据放在不同的物理分区表里。具体的分区方式为: 第1个小表:2010-1-1以前的数据(不包含2010-1-1)。 第2个小表:2010-1-…

最优化学习笔记(十五)——拟牛顿法(1)

拟牛顿法分为五部分来讲,本文这部分作为引言,第二部分讲Hessian矩阵逆矩阵的近似,第三部分秩1修正公式,第四部分为DFP算法,最后BFGS算法。 牛顿法是一种具有较高实用性的优化问题的求解方法。牛顿法如果收敛&…

深入理解java虚拟机 (一) 第二版

前言: Java是目前用户最多、使用范围最广的软件开发技术之一。Java 的技术体系主要由支撑Java程序运行的虚拟机、提供各开发领域接口支持的Java API、 Java编程语言及许多第三方Java框架(如Spring、Struts 等)构成。在国内,有关Java API Java语言语法及…

畅通您的iOS开发之路

随着大家对苹果产品的趋之若鹜,iphone与ipad软件开发的前景也相当广阔。然而,目前精通iOS开发的专业人才却是凤毛麟角。因此,安博中 程在2012年推出重磅课程——“iPhone与iPad开发实战之路——精通iOS开发”高级培训班,为想从事i…

深入理解java虚拟机 (二) 第二版

如何阅读本书 本书-共分为五个部分:走近Java、自动内存管理机制、虛拟机执行子系统、程序编译与代码优化、高效并发。各部分基本上是互相独立的,没有必然的前后依赖关系,读者可以从任何- -个感兴趣的专题开始阅读,但是每个部分中的各个章节间…

最优化学习笔记(十六)——拟牛顿法(2)

Hessian矩阵逆矩阵的近似 一、拟牛顿法的基本思路 令H0,H1,H2,…表示Hessian矩阵逆矩阵F(x(k))−1的一系列近似矩阵。我们要讨论的是这些近似矩阵应该满足的条件,这是拟牛顿法的基础。首先,假定目标函数f的Hessian矩阵F(x)是常数矩阵,与x无关…

tool vmmap 配置符号文件 symbolic file

转载于:https://www.cnblogs.com/titer1/archive/2012/03/21/2410316.html

最优化学习笔记(十七)——拟牛顿法(3)

秩1修正公式 在秩1修正公式中,修正项为αkz(k)z(k)T,αk∈R,z(k)∈Rn,是一个对称矩阵,近似矩阵的更新方程为: Hk1Hkαkz(k)z(k)T\boldsymbol{H}_{k+1} = \boldsymbol{H}_{k} + \alpha_k\boldsymbol{z}^{(k)}\boldsymbol{z}^{(k)T}注意&#…

深入理解java虚拟机 (三) 第二版

参考资料 本书名为“深人理解Java虚拟机”,但要想深人理解虚拟机,仅凭- -本书肯定是远远不够的,读者可以通过以下信息找到更多关于Java虚拟机方面的资料。我在写作此书的时候,也从下面这些参考资料中获得了很大的帮助。. (1)书籍…

memcached 如果进程占用cpu很高

memcached 如果进程占用cpu很高一客户占用到了 25% 把mencache内存大小从32m 改成256m 后 memcached 基本占用cpu 是0可能分配的内存不够用了 大量的新缓存需要进入 同时大量的旧缓存又需要被淘汰出来 导致 一进一出非常频繁 从而导致服务性能下降加大内存吧操作如下&#xff…

最优化学习笔记(十八)——拟牛顿法(4)DFP算法

秩2算法可以保证在任意第k步迭代下, 只要一维搜索是精确的,近似矩阵Hk就是正定的。 DFP算法 令k0,选择初始点x(0),任意选择一个堆成正定实矩阵H0。如果g(k)0, 停止迭代; 否则,令d(k)−Hkg(k)计算 αkargminα≥0f(x(k)αd(k)…

《深入理解java虚拟机》第1章 走近Java

1.4 Java虚拟机发展史 上一节我们从整个Java技术的角度观察了Java 技术的发展,许多Java程序员都会潜意识地把它与Sun公司的HotSpot虚拟机等同看待,也许还有一些程序员会注意到BEA.JRockit和IBM J9,但对JVM的认识不仅仅只有这些。从1996年初S…

Asp.net报表制作 OpenFlashChart免费图表组件

Asp.net报表制作 OpenFlashChart免费图表组件 OpenFlashChart是一款开源的以Flash和Javascript为技术基础的免费图表组件,用它能创建一些很有效果的报表分析图表。  最重要的是它是开源和免费的,该组件使用flash展示报表能够很好的做到与浏览器进行集成…

使用简单的5个步骤设置 Web服务器集群

通过在多个处理器之间分担工作负载并采用多种软件恢复技术,能够提供高度可用的环境并提高环境的总体 RAS(可靠性、可用性和可服务性)。可以得到的好处包括:更快地从意外中断中恢复运行,以及将意外中断对终端用户的影响…