Bruce Tate , 总裁, J2Life, LLC
轻量U容器可以动态地使系l主要组件之间的耦合变松散。不同的容器包含相同的设计模式,但却hҎ(gu)不同的哲学。本文帮助?zhn)在下列三U轻量容器之间作出最佳选择QSpring Framework、HiveMind ?PicoContainer?BR>
2002 q在U罗拉多的一ơ旅行中Q我完美地感受了阿肯色河。在三段不同的漂中Q这条河展示了o(h)人惊异的多样性。柔的布朗峡谷有着开阔的急流Q翻滚着巨大的L。Royal Gorge 别具特色的?zhn)崖峭壁引导着巨大而笔直的峡谷之下的水力,在这条直U上发生一点小闪失都会(x)受到镉K游泳的惩罚。Numbers h_֯的落差,需要h们在范围狭窄(jing)的圆矌园里_操纵。在一条河里,我有了三ơ极不相同的体验?/P>
在我的上一文章?A >轻量U开发的成功U诀Q第 3 部分QSpring 露出水面”中Q我们学?fn)了轻量U容器的基本原理。本文将向?zhn)展示三种最行的容器:(x)
q三U容器都源于依赖注入Q但每种容器都具有极不相同的特征。当我介l每U容器的高描述Ӟ(zhn)将看到正在q行的每U框Ӟ以及(qing)可以应用每种框架的环境?/P>
核心哲学
q三U容器都接受 POJO (plain old Java object)Q都h对象生命周期的钩子(所以它们可以在创徏或销?bean 时调用?zhn)的代码?j)Q都执行依赖注入。?zhn)可能认?f)q些L律将D怼的容器,但事实ƈ非如此。尽植入每U容器的代码可能怼Q但容器本n反映了不同的能力、风格和整体哲学。总而言之,每种容器的作者都忠于他们的哲学?/P>
Spring Framework
作ؓ(f)开放源码框架的 GenevaQSpring Framework 为数百个 Java 2 Platform, Enterprise Edition (J2EE) API 和开放源码框架提供了轻量U容器和胶水代码 (glue code)。Spring 有一个最重要的前景:(x)?J2EE 更易使用。读完一些示例和书籍之后Q?zhn)看C些常见的主题Q?
- Spring 支持三种依赖注入—?I>setter?I>构造函?/I> ?Ҏ(gu) 注入——但ȝ来说Q最行的模型是 setter 注入?
- 在灵zL和单性之_(d)Spring ?XML 风格配置更重视灵zL。?zhn)可以做Q何事情,但对于初学者来_(d)配置文g是晦涩难懂的?
- Spring 的创始h认ؓ(f)Q容器只是整体框架的一部分。Spring 的大部分价值来源于支持该框架的数千行胶水代码。它易于插入Mpȝ中?
- Spring 框架是三U容器实C最完美的。一般来_(d)优秀的文档都是完编写的?
- Spring h自动q线 (autowire) 方式Q但大多数示例都没有使用它。我q不十分了解q个决策Q但有时候,能够看到明确列出的依赖关pL不错的?
- Spring 提供了完整的 AOP 框架Q得更Ҏ(gu)附加服务。?zhn)可以使?Spring 自己的框架或依赖丰富?AspectJ 集成Q参?参考资?/FONT>Q?/LI>
如果要用一个短语来形容 SpringQ我?x)?I>让企业更?/I>?/P>
HiveMind
Howard Lewis Ship ?Jakarta Tapestry Web 框架的创,他还创徏?HiveMind。作Z个容器,HiveMind 是灵巧、干净且易于用的。与其他许多较好的开放源码框架一PShip 创徏 HiveMind 是ؓ(f)了让它帮助解决现实问题。但是,HiveMind 向传l的轻量U容器添加了两个创新Q?/P>
- 最重要?HiveMind 创新是模块。据 Ship 所_(d)Eclipse 插gȀ发了他的 HiveMind 模块的灵感?
- HiveMind 强制(zhn)编写接口。(与所有轻量容器一P它不提供接口Q而由(zhn)自己提供接口。)(j)
- HiveMind 是用户友好的Q它提供UCؓ(f) HiveDoc 的文档工P友好明的 XML 配置Q以?qing)行准确的错误报告?
- HiveMind 用户通常优先选择 setter 注入Q但该容器还支持构造函数注入?/LI>
如果用一个短语来形容 HiveMind 的话Q我?x)说它?I>概念正确 的?/P>
PicoContainer
到目前ؓ(f)止,PicoContainer 最重要的特征是它的寸。它没有提供许多附加物,但它h完整的依赖注入容器。PicoContainer q具有一些惟一Ҏ(gu):(x)
- PicoContainer 很小Q所以它没有拦截器、AOP 或相似类型的服务Q而选择了让其他框架创徏q些服务?
- PicoContainer 支持 Java 配置技术,而不支持 XML 配置技术,q与其他容器一栗?
- PicoContainer 行的用模型是构造函数注入,但它也支?setter 注入?
- PicoContainer 没有提供许多文档Q而且一些现有文档是不完整的Q但(zhn)不?x)太需要?
- PicoContainer h一个自动连U方式,它很不错?
- PicoContainer 的发展似乎有点停滞?/LI>
如果用一个短语来形容 PicoContainer 的话Q我?x)选择理论完美Q但不如 Spring ?HiveMind 实用?/P>
~程模型
现在我将向?zhn)展示C中流行的~程CZQ以帮助(zhn)更好地理解容器的作者希望?zhn)如何使用它们。我使用 PicoContainer 中的 Kiss CZ来展C?autowiring ?Java 技术风格的配置Q?HiveMind 加法器示例来展示模块能力Q?Spring PetClinic 应用E序来展C?Hibernate 集成?/P>
Kiss CZ (PicoContainer)
在这三个容器中,PicoContainer h最单的~程模型。要查看 Kiss CZQ可?PicoContainer.org 下蝲它。安装该CZQ浏览到 docs\Two+minute+tutorial.htmQ然后?zhn)会(x)看C个组Ӟ(x)
清单 1. 两个 Kiss lg
public class Boy {
public void kiss(Object kisser) {
System.out.println("I was kissed by " + kisser);
}
}
public class Girl {
Boy boy;
public Girl(Boy boy) {
this.boy = boy;
}
public void kissSomeone() {
boy.kiss(this);
}
}
|
q两个类是自解释的。Girl ?Boy 有依赖关pR该依赖关系通过构造函数被注入。先实例化一个容器:(x)
MutablePicoContainer pico = new DefaultPicoContainer();
|
然后注册两个lgQ?/P>
pico.registerComponentImplementation(Boy.class);
pico.registerComponentImplementation(Girl.class);
|
E后(zhn)可以向 PicoContainer h一个对象,然后操作它:(x)
Girl girl = (Girl) pico.getComponentInstance(Girl.class);
girl.kissSomeone();
|
q样差不多了。编E模型是优雅的,Z构造函数的风格意味着(zhn)无需包括无参构造函数。对本例中的 Girl 调用q种函数会(x)使该对象处于不一致的状态,因ؓ(f) kiss
Ҏ(gu)抛出异常?/P>
加法器示?(HiveMind)
现在Q让我们看一?HiveMind 的编E示例。从 Apache Jakarta Project 下蝲 HiveMindQ然后查看加法器CZ。?zhn)会(x)看到接口和实现。(CQHiveMind 强制~写接口。)(j)
清单 2. 加法器示例接口和实现
public interface Adder
{
public double add(double arg0, double arg1);
}
public class AdderImpl implements Adder
{
public double add(double arg0, double arg1)
{
return arg0 + arg1;
}
}
|
该服务暴露?XML 文g中,如下所C:(x)
清单 3. 该服务暴露?XML 文g?/B>
然后Q其他应用程序就可以使用该服务了Q如下所C:(x)
清单 4. 其他应用E序可以使用该服?/B>
Registry registry = RegistryBuilder.constructDefaultRegistry();
Adder adder = (Adder) registry.getService("examples.Adder",
Adder.class);
... adder.add(arg0, arg1)
|
注意QHiveMind 的模块让(zhn)可以将多个服务l合C赗如果?zhn)需要向容器中的服务d功能Q可以用拦截器Q?/P>
清单 5. 使用拦截器添加功?/B>
PetClinic 应用E序 (Spring)
Spring 处理事情的方法有些不同。因?Spring 框架不带有简单的应用E序Q我从我的书c?Spring: A Developer's Notebook 中选择了一个。?zhn)可以?O'Reilly Media 获取该示例代码。解压示?4Q它展示了一个用?RentaBike 商店的带有属性的 CommandLineView
对象Q该对象最l成应用E序的数据访问对象?/P>
清单 6. CommandLineView 对象
public class CommandLineView {
private RentABike rentaBike;
public CommandLineView() {}
public void setRentABike(RentABike rentaBike) {this.rentaBike = rentaBike;}
public RentABike getRentaBike() { return this.rentaBike; }
...
}
|
RentaBike 是具有?zhn)希望在自行R商店对象中看到的各种Ҏ(gu)的接口:(x)
清单 7. 接口Ҏ(gu)
public interface RentABike {
List getBikes();
Bike getBike(String serialNo);
void setStoreName(String name);
String getStoreName();
}
|
没有昄 ArrayListBikeStore
Q它?BikeStore 接口的存根实现。注意,Spring 允许~写接口Q但不强制编写接口。下面是描述该应用程序中 bean ?XML 配置文gQ?/P>
清单 8. 描述应用E序 bean ?XML 配置文g
该上下文中有两个 bean?CODE>commandLineView bean 依赖?rentaBike
bean。该应用E序通过?rentaBike
属性指?rentaBike
名称Q显式解析该依赖关系。注意,PicoContainer 自动q接q种昑ּ关系QSpring 也可以,但大多数用户不用它的自动连UK项。Spring q允许?zhn)通过拦截器或 AOP 向外观的MҎ(gu)d服务?/P>
比较
既然已经看到每种容器的哲学,下面是对每种环境的无形特性的详细比较Q比如市(jng)Z额、整体质量(fit and finishQ和整体Ҏ(gu)列表。毕竟,即ɾ~程模型是完的Q但如果没有文档Q或者由于缺乏社?zhn)必须自己支持它,那么它也不?x)成ؓ(f)一个好容器?/P>
zdC
Spring 有一个充满活力的CQ和一个支持该框架的称?Interface21 的职业服务公司。这很重要,因ؓ(f)(zhn)知道?zhn)可以获得良好的支持,公司才有动力来支?Spring 框架。我在社区的l历直太好了。Spring 贡献者、创始h和用户都以杰出的内容填满了留aѝ?/P>
HiveMind 框架是一?Apache Jakarta 目Q所以有着扎实的基。它有一个正在成长的萌芽C。该框架的创始h Howard Lewis Ship 是独立顾问、优U导师和不屈不挠的提倡者。但是,要利?HiveMind 的质量帮助或者查扑օ Web 站点之外的内容仍然十分困难。尽如此,它的在线帮助g不错Q而且Cg正在成长。Hibernate 获得了有的胜利Q它被选中——或者更应该_(d)Ship 被选中——组?TheServerSide.com 的新基础设施QTheServerSide.com 是最重要?Java 技术社Z一?/P>
PicoContainer 也是一?Apache Jakarta 目Q它g发展~慢。截止本文撰E,PicoContainer 的最后一ơ主要代码发行是?2004 q?11 月。?zhn)看不到太多有?PicoContainer 的新文章Q这有点惭愧Q因为我喜欢 PicoContainer 的一些哲学。事实上Q我不太定有没有三U开放源码轻量容器的空_(d)其是最q第四种轻量U容器项?Avalon 关闭之后?/P>
每个社区生成的zd而言QSpring 无疑是优胜者。Interface21 的支持、奇思妙想的论坛、活跃的邮g列表以及(qing)C的跟t记录都是无与u比的?/P>
整体质量
C的大和实力通常驱动开放源码项目的整体质量。充满活力的C需要更好的文档和示例,而且它们?x)参与完成结详细信息?/P>
Spring 团队~写了可与我见过的一些比较好的商业品相媲美的文档。如果这q不够的话,(zhn)还可以扑ֈ臛_五本主要 Spring 书籍和其他许多包?Spring 内容的出版物。(我自己曾撰写q两本有?Spring 的书c,其中一本书中包?Jolt-winning Better, Faster, Lighter Java 一章,另一本是快速入门书c?Spring: A Developer's NotebookQ。错误消息是专业性和描述性的。与W三Ҏ(gu)架和 API 的集成是所?Java 技术框架中最好的。包装是l过深思熟虑的Q不q略有多余。(它帮助我开始把一些比较小的项目划分成模块。)(j)CZ是优U且有指导意义的?/P>
?Tapestry 一PHiveMind 也具有好的整体质量。Ship 自己以那些让 HiveMind 变得单易用的Ҏ(gu)而自豪,比如行准的错误报告Q友好简明的 XML 语法Q良好的文档工具 HiveDoc。与用于低详细信息?JavaDoc 文档l合使用Q?zhn)可以更好地描q?zhn)的应用程序(HiveMind 模块Q的高Ҏ(gu),从而完善它们之间的依赖关系?/P>
PicoContainer ~程模型感觉自然Q但文档不完_(d)许多Ҏ(gu)标记看v来过时好几个月了Q,而且没有许多使用该容器的真实世界CZ。有时候,我会(x)觉得自己在独自穿q鬼出没的破屋?/P>
但?PicoContainer 实有一个主要优炏V因为?zhn)配置现实世界的对象时Q会(x)得到一些编译时错误(g)查。实际上Q该容器太小太轻了,以至于除了基本配|之外,没有什么能出错。PicoContainer 做了一合理的工作?/P>
Ҏ(gu)?/FONT>
我不惌多地讨论Ҏ(gu)。如果?zhn)正在L许多胶水代码来减?zhn)的开放源码收藏夹的集成或某特?J2EE APIQSpring 无疑是最佳选择。HiveMind 不尝试参与竞争。相反,它与 Spring 的服务兼宏VPicoContainer 不构且也不试构徏附加物,而是选择让开放源码项目ؓ(f)其提供服务。到目前为止Q它的效果不太好?/P>
哪一个最好?
目前Q只有一个真正的{案。HiveMind h有趣的创斎ͼPicoContainer h易于使用的模型(理论上)(j)Q但Cg已经投票选择?Spring Framework。随着旉的推U,新的容器可能?x)成长,HiveMind 可能不断获得?jng)场份额Q但目前QSpring 是?zhn)的最佳选择?/P>
如果(zhn)愿意冒一些险Q而用不太成熟或不太行的容器,(zhn)可能决定实?HiveMindQ如果需要模块别的配置Q或 PicoContainerQ如果想要微的容器Q。如果需要许多胶水代码来集成持久引擎、事务处理策略和安全性等斚wQSpring h最完整的组件堆。但误住:(x)(zhn)可以在 HiveMind 容器中?Spring lg?BR>
参考资?
学习(fn)
- (zhn)可以参阅本文在 developerWorks 全球站点上的 英文原文 ?
- “轻量开发”是一个很大的主题Q而开发h员经常提到这个说法,以至难以界定它到底是什么含义。?A >轻量U开发的成功U诀Q第 1 部分Q核心原则及(qing)原理”开始了q个pdQ向(zhn)介l了该运动背后的核心原则?qing)原理?BR>
- 重量U架构(?Enterprise JavaBeansQ用于日帔R题可能有点大材小用。?A >轻量U开发的成功U诀Q第 2 部分Q减d?/FONT>”介l了轻量U容器,q解释它们如何提供满x业务需要的服务Q而无需?zhn)束?x)在一个指定的~程模型之上?BR>
- 在本pd的第三篇文章?A >轻量U开发的成功U诀Q第 3 部分QSpring 露出水面”,学习(fn)轻量U容器的基本概念?BR>
- ?Inversion of Control Containers 一文中Q阅?Mike Spille 对这三个容器所做的比较?BR>
- 讉K HiveMind 获得CZ、blogs 和代码?BR>
- PicoContainer.org 不太z跃Q但是其中有很多关于Z构造函数的注入的思想?BR>
- 阅读 Bruce A. Tate ?Justin Gehtland ~写?Spring: A Developer's Notebook 一书(O'Reilly, 2005 q_(d)(j)Q快速入?Spring?BR>
- 感谢 Interface21 Ҏ(gu)写本文所提供的帮助?BR>
- Martin Fowler 撰写的关于依赖注入的文章 Inversion of Control Containers and the Dependency Injection patternQ很好地描述了依赖注入和服务定位器?BR>
- Bruce A. Tate ?Justin Gehtland ~写?Better, Faster, Lighter Java 一书(O'Reilly, 2004 q_(d)(j)Q很好地概述了轻量开发?BR>
- Rob Harrop ?Jan Machacek ~写?Pro SpringQApress, 2005 q_(d)(j)?Craig Walls ?Ryan Breidenbach ~写?Spring in ActionQManning, 2005 q_(d)(j)q两本书全面介绍?Spring?BR>
- developerWorks 文章?A >无需容器的对象关pL?/FONT>”介l了如何?Hibernate 一起?Spring 持久性?BR>
- 阅读 developerWorks 文章?A >AOP@Work: AOP 工具比较Q第 1 部分”,了解 AOPQ这是一U有较好透明性的轻量U技术?BR>
- 文章?A >Eclipse q_入门”(developerWorks, 2002 q?11 月)(j)提供?Eclipse 的历史和概述Q以?qing)关于如何安?Eclipse 和插件的详细信息?BR>
- 讉K developerWorks 开放源码专?/FONT>Q获得广泛的 how-to 信息、工具和目更新Q以帮助(zhn)利用开放源码技术进行开发,q与 IBM 产品l合使用?BR>
关于作?/FONT>
 |
|
Bruce Tate 居住在d克萨斯州的首府奥斯汀Q他是一位父Ԍ同时也是山地车手和皮艇手。他?3 本最畅销 Java 书籍的作者,其中包括荣获 Jolt 大奖?Better, Faster, Lighter Java 一书,最q又出版?Spring: A Developer's Notebook 一书。他?IBM 工作?13 q_(d)现在?J2Life、LLC 的创始h兼顾问。他潜心研究Z Java ?Ruby 的轻量开发策略和架构?/P> |
原文Q?BR>http://www-128.ibm.com/developerworks/cn/opensource/os-lightweight4/
]]>