控制反转和依赖注入

控制反转和依赖注入

ID:14136991

大小:81.50 KB

页数:44页

时间:2018-07-26

控制反转和依赖注入_第1页
控制反转和依赖注入_第2页
控制反转和依赖注入_第3页
控制反转和依赖注入_第4页
控制反转和依赖注入_第5页
资源描述:

《控制反转和依赖注入》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、控制反转和依赖注入-----------------------Page1-----------------------IoC容器和DependencyInjection模式撰文/MartinFowler编译/透明Java社群近来掀起了一阵轻量级容器的热潮,这些容器能够帮助开发者将来自不同项目的组件组装成为一个内聚的应用程序。在它们的背后有着同一个模式,这个模式决定了这些容器进行组件装配的方式。人们用一个大而化之的名字来称呼这个模式:“控制反转”(InversionofControl,IoC)。在本文中,我将深入探索这个模式的工作原理,给它一个更能描述其特

2、点的名字——“依赖注入”(DependencyInjection),并将其与“服务定位器”(ServiceLocator)模式作一个比较。不过,这两者之间的差异并不太重要,更重要的是:应该将组件的配置与使用分离开——两个模式的目标都是这个。在企业级Java的世界里存在一个有趣的现象:有很多人投入很多精力来研究主流J2EE技术的替代品——自然,这大多发生在opensource社群。在很大程度上,这可以看作是开发者对主流J2EE技术的笨重和复杂作出的回应,但其中的确有很多极富创意的想法,的确提供了一些可供选择的方案。J2EE开发者常遇到的一个问题就是如何组装不

3、同的程序元素:如果web控制器体系结构和数据库接口是由不同的团队所开发的,彼此几乎一无所知,你应该如何让它们配合工作?很多框架尝试过解决这个问题,有几个框架索性朝这个方向发展,提供了更通用的“组装各层组件”的方案。这样的框架通常被称为“轻量级容器”,PicoContainer和Spring都在此列中。在这些容器背后,一些有趣的设计原则发挥着作用。这些原则已经超越了特定容器的范畴,甚至已经超越了Java平台的范畴。在本文中,我就要初步揭示这些原则。我使用的范例是Java代码,但正如我的大多数文章一样,这些原则也同样适用于别的OO环境,特别是.NET。组件和服

4、务“装配程序元素”,这样的话题立即将我拖进了一个棘手的术语问题:如何区分“服务”(service)和“组件”(component)?你可以毫不费力地找出关于这两个词定义的长篇大论,各种彼此矛盾的定义会让你感受到我所处的窘境。有鉴于此,对于这两个遭到了严重滥用的词汇,我将首先说明它们在本文中的用法。所谓“组件”是指这样一个软件单元:它将被作者无法控制的其他应用程序使用,但后者不能对组件进行修改。也就是说,使用一个组件的应用程序不能修改组件的源代码,但可以通过作者预留的某种途径对其进行扩展,以改变组件的行为。服务和组件有某种相似之处:它们都将被外部的应用程序使

5、用。在我看来,两者之间最大的差异在于:组件是在本地使用的(例如JAR文件、程序集、DLL、或者源码导入);而服务是要通过——同步或异步的——远程接口来远程使用的(例如webservice、消息系统、RPC,或者socket)。在本文中,我将主要使用“服务”这个词,但文中的大多数逻辑也同样适用于本地组件。实际上,为了方便地访问远程服务,你往往需要某种本地组件框架。不过,“组件或者服务”这样一个词组实在太麻烦了,而且“服务”这个词当下也很流行,所以本文将用“服务”指代这两者。-----------------------Page2---------------

6、--------一个简单的例子为了更好地说明问题,我要引入一个例子。和我以前用的所有例子一样,这是一个超级简单的例子:它非常小,小得有点不够真实,但足以帮助你看清其中的道理,而不至于陷入真实例子的泥潭中无法自拔。在这个例子中,我编写了一个组件,用于提供一份电影清单,清单上列出的影片都是由一位特定的导演执导的。实现这个伟大的功能只需要一个方法:classMovieLister...publicMovie[]moviesDirectedBy(Stringarg){ListallMovies=finder.findAll();for(Iteratorit=all

7、Movies.iterator();it.hasNext();){Moviemovie=(Movie)it.next();if(!movie.getDirector().equals(arg))it.remove();}return(Movie[])allMovies.toArray(newMovie[allMovies.size()]);}你可以看到,这个功能的实现极其简单:moviesDirectedBy方法首先请求finder(影片搜寻者)对象(我们稍后会谈到这个对象)返回后者所知道的所有影片,然后遍历finder对象返回的清单,并返回其中由特定的某

8、个导演执导的影片。非常简单,不过不必担心,这只是整个例子的脚手架罢

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。