没有合适的资源?快使用搜索试试~ 我知道了~
首页Martin Fowler 控制反转与依赖注入
摘要:Java社群近来掀起了一阵轻量级容器的热潮,这些容器能够帮助开发者将来自不同项目的组件组装成为一个内聚的应用程序。在它们的背后有着同一个模式,这个模式决定了这些容器进行组件装配的方式。人们用一个大而化之的名字来称呼这个模式:“控制反转”( Inversion of Control,IoC)。在本文中,我将深入探索这个模式的工作原理,给它一个更能描述其特点的名字——“依赖注入”(Dependency Injection),并将其与“服务定位器”(Service Locator)模式作一个比较。不过,这两者之间的差异并不太重要,更重要的是:应该将组件的配置与使用分离开——两个模式的目标都是这个。
资源详情
资源评论
资源推荐
IoC 容器和 Dependency Injection 模式
Martin Fowler
摘要:Java 社群近来掀起了一阵轻量级容器的热潮,这些容器能够帮助开发者将来自
不同项目的组件组装成为一个内聚的应用程序。在它们的背后有着同一个模式,这个模式
决定了这些容器进行组件装配的方式。人们用一个大而化之的名字来称呼这个模式:“控制
反转”( Inversion of Control,IoC)。在本文中,我将深入探索这个模式的工作原理,
给它一个更能描述其特点的名字——“依赖注入”(Dependency Injection),并将其与
“服务定位器”(Service Locator)模式作一个比较。不过,这两者之间的差异并不太重要,
更重要的是:应该将组件的配置与使用分离开——两个模式的目标都是这个。
目录
组件和服务.........................................................................................................................................3
一个简单的例子.................................................................................................................................3
控制反转.............................................................................................................................................5
依赖注入的几种形式.........................................................................................................................6
使用 PicoContainer 进行构造函数注入....................................................................................7
使用 Spring 进行设值方法注入................................................................................................8
接口注入.....................................................................................................................................9
使用 Service Locator.......................................................................................................................10
为定位器提供分离的接口.......................................................................................................12
动态服务定位器.......................................................................................................................13
用 Avalon 兼顾服务定位器和依赖注入.................................................................................14
作出一个选择...................................................................................................................................14
Service Locator vs. Dependency Injection...............................................................................15
构造函数注入 vs. 设值方法注入............................................................................................16
代码配置 vs. 配置文件............................................................................................................17
分离配置与使用.......................................................................................................................17
更多的问题.......................................................................................................................................18
结论和思考.......................................................................................................................................18
致谢...................................................................................................................................................19
在企业级 Java 的世界里存在一个有趣的现象:有很多人投入很多精力来研究主流
J2EE 技术的替代品——自然,这大多发生在 open source 社群。在很大程度上,这可以
看作是开发者对主流 J2EE 技术的笨重和复杂作出的回应,但其中的确有很多极富创意的
想法,的确提供了一些可供选择的方案。J2EE 开发者常遇到的一个问题就是如何组装不同
的程序元素:如果 web 控制器体系结构和数据库接口是由不同的团队所开发的,彼此几乎
一无所知,你应该如何让它们配合工作?很多框架尝试过解决这个问题,有几个框架索性
朝这个方向发展,提供了更通用的“组装各层组件”的方案。这样的框架通常被称为“轻量级
容器”,PicoContainer 和 Spring 都在此列中。
在这些容器背后,一些有趣的设计原则发挥着作用。这些原则已经超越了特定容器的
范畴,甚至已经超越了 Java 平台的范畴。在本文中,我就要初步揭示这些原则。我使用的
范例是 Java 代码,但正如我的大多数文章一样,这些原则也同样适用于别的 OO 环境,特
别是.NET。
组件和服务
装配程序元素,这样的话题立即将我拖进了一个棘手的术语问题:如何区分“服务”
(service)和“组件”(component)?你可以毫不费力地找出关于这两个词定义的长篇
大论,各种彼此矛盾的定义会让你感受到我所处的窘境。有鉴于此,对于这两个遭到了严
重滥用的词汇,我将首先说明它们在本文中的用法。
所谓“组件”是指这样一个软件单元:它将被作者无法控制的其他应用程序使用,但后
者不能对组件进行修改。也就是说,使用一个组件的应用程序不能修改组件的源代码,但
可以通过作者预留的某种途径对其进行扩展,以改变组件的行为。
服务和组件有某种相似之处:它们都将被外部的应用程序使用。在我看来,两者之间
最大的差异在于:组件是在本地使用的(例如 JAR 文件、程序集、DLL、或者源码导入);
而服务是要通过同步或异步的远程接口来远程使用的(例如 web service、消息系统、
RPC,或者 socket)。
在本文中,我将主要使用“服务”这个词,但文中的大多数逻辑也同样适用于本地组件 。
实际上,为了方便地访问远程服务,你往往需要某种本地组件框架。不过,“组件或者服务”
这样一个词组实在太麻烦了,而且“服务”这个词当下也很流行,所以本文将用“服务”指代这
两者。
一个简单的例子
为了更好地说明问题,我要引入一个例子。和我以前用的所有例子一样,这是一个超
级简单的例子:它非常小,小得有点不够真实,但足以帮助你看清其中的道理,而不至于
陷入真实例子的泥潭中无法自拔。
在这个例子中,我编写了一个组件,用于提供一份电影清单,清单上列出的影片都是
由一位特定的导演执导的。实现这个伟大的功能只需要一个方法:
class MovieLister...
public Movie[] moviesDirectedBy(String arg)
{
List allMovies = finder.findAll();
for (Iterator it = allMovies.iterator(); it.hasNext();)
{
Movie movie = (Movie) it.next();
if (!movie.getDirector().equals(arg))
{
it.remove();
}
}
return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]);
}
你可以看到,这个功能的实现极其简单:moviesDirectedBy 方法首先请求 *nder
(影片搜寻者)对象(我们稍后会谈到这个对象)返回后者所知道的所有影片,然后遍历
*nder 对象返回的清单,并返回其中由特定的某个导演执导的影片。非常简单,不过不必
担心,这只是整个例子的脚手架罢了。我们真正想要考察的是 *nder 对象,或者说,如何
将 MovieLister 对象与特定的 *nder 对象连接起来。为什么我们对这个问题特别感兴趣?
因为我希望上面这个漂亮的 moviesDirectedBy 方法完全不依赖于影片的实际存储方式。
所以,这个方法只能引用一个 *nder 对象,而 *nder 对象则必须知道如何对 *ndAll 方法
作出回应。为了帮助读者更清楚地理解,我给 *nder 定义了一个接口:
public interface MovieFinder
{
List findAll();
}
现在,两个对象之间没有什么耦合关系。但是,当我要实际寻找影片时,就必须涉及
到 MovieFinder 的某个具体子类。在这里,我把涉及具体子类的代码放在 MovieLister
类的构造函数中。
class MovieLister...
private MovieFinder finder;
public MovieLister()
{
finder = new ColonDelimitedMovieFinder("movies1.txt");
}
这个实现类的名字就说明:我将要从一个逗号分隔的文本文件中获得影片列表。你不
必操心具体的实现细节,只要设想这样一个实现类就可以了。如果这个类只由我自己使用
一切都没问题。但是,如果我的朋友叹服于这个精彩的功能,也想使用我的程序,那又会
怎么样呢?如果他们也把影片清单保存在一个逗号分隔的文本文件中,并且也把这个文件
命名为“ movie1.txt ”,那么一切还是没问题。如果他们只是给这个文件改改名,我也可
剩余18页未读,继续阅读
yq983941665
- 粉丝: 1
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- RTL8188FU-Linux-v5.7.4.2-36687.20200602.tar(20765).gz
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
- SPC统计方法基础知识.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论7