本书的内容
本书阐述如何在服务器上进行基于组件的开发。这些技术的例子包括当前得到广泛应用的企业JavaBeans(EJB),CORBA组件模型(CCM)或微软的COM+。为构建基于这些技术的成功应用,开发者应该理解这种组件体系结构的工作—在规范和大部分书中没有说得很清楚的东西。本书的第一部分介绍从概念上描述这些体系结构的一种模式语言。为给出“现实环境中的基础”,第二部分给出使用EJB技术实现这些模式的大量实例。最后,第三部分说明这些模式为真实应用带来的好处。
谁应该读这本书
分布式组件(特别是EJB)是“外观友好的复杂技术”。这就意味着众多的复杂性被简单的界面所掩盖,或通过向导而实现。然而,要基于这些技术创建可维护的高效应用,我们认为有必要了解这些体系结构实际是如何运作的,以及某些特定的设计技术是如何使用的。这些技术不同于面向对象技术—试图为组件使用OO技术会导致非常低效的系统。
本书由三个独立的部分构成。第一部分写给开发人员或架构师,他们需要学习任何主流的组件技术中用到的基本原理和概念。我们用模式语言的形式来完成这项工作。由于每个模式都包括EJB、CCM和COM+的一个短小实例,你也可以从本节内容来理解这些技术之间的差异。由于本部分中的概念是用非常通用的方式描述的,因此也有助于你创建自己的专用组件体系结构。
第二部分有两个主要目的。首先,它用更具体、更丰富的例子阐述第一部分中的模式。由于以EJB为例,因此这部分对EJB的开发者最有用,但是COM+和CCM的用户也可以学到不少模式的实现细节。你还可以将这部分看成是EJB简明教程,尽管我们假定读者对EJB有一些基本了解。
最后第三部分说明模式给应用开发者提供了什么。借助一个用EJB开发的网上购物系统,我们说明了基于组件的开发方法比“正常的”方法好的优点。这部分写成一位组件新手和一位有经验的咨询顾问之间的对话。它说明模式是如何影响EJB开发者的日常工作的。
本书的结构
本书讲解服务器端组件模式。有3个主要部分,下面列出各部分的目的:
?“基础知识”,作为本书的绪论。首先对本书中的“组件”一词进行定义,并与其他类型的组件作了区分。第二,引入模式和模式语言,并说明如何在本书中使用它们。第三,介绍4个原理。每种技术都是基于一套原理的,也就是技术开发者在设计时牢记在心的指导原则。理解了这些原理,才能对技术知其所以然。对组件体系结构来说也是如此。
?第一部分,“服务器组件模式语言”,描述“产生”服务器端组件体系结构的模式语言。由于模式的基本原理是“模式是被证实了的解决方案”,因此已知应用很重要。我们使用3个最重要的组件模型作为例子,即Enterprise JavaBeans(EJB),CORBA组件模型(CCM)和COM+。这些例子是概念性的,仅作简单的介绍。
?第二部分,“用EJB描述的模式”,给出第一部分中模式的大量例子,用EJB技术实现。说明在这些情况下如何应用这些模式,也介绍EJB体系结构。这部分包括EJB源代码和UML图。
?第三部分,“一个故事”,是两个人之间的一段对话,他们讨论一个基于EJB的电子商务应用的设计与实现。这给出了观察模式的另一种方式。
例子技术
模式只有被实际应用或使用过才能被看作是模式。因此一般的模式写作过程首先是从具体系统中“寻找”相关模式,并从这些应用中抽象出核心模式。
对本书第一部分中的技术模式而言,这些具体的系统是3个最流行的服务器端组件体系结构,EJB、CORBA组件和COM+。本节给出这3种技术的简介,并为进一步阅读列出参考资料。
EJB
EJB是由Sun公司定义的服务器端组件体系结构。它的目标是实现企业业务解决方案,很注重基于Web的应用和与遗留系统的集成。EJB是更大的服务器端体系结构Java 2企业版(J2EE)的一部分。
虽然由于定义了到CORBA和IIOP(CORBA的基于TCP/IP的传输协议)的映射,可以通过其他的编程语言来访问EJB组件(Bean),但EJB和J2EE是完全Java的解决方案。EJB并不是一个官方标准,它是Sun公司的产品。然而,很多其他公司参与了这个体系结构的创建,而且市场上有很多这个标准的实现,既有开放源代码的服务器,也有很昂贵的商业应用。
介绍EJB的一本好书是Monson-Haefel的《Enterprise JavaBeans》[MH00]。Sun公司的EJB规范[SUNEJB]也值得一读。《Java Server Programming》[SU01]更广泛地介绍了J2EE,也包括EJB。当前EJB的版本是2.0。然而从模式语言的角度看,EJB 2.0没有引入很多新的特性。它在某些方面的确有了明显的改进,主要是在持久性和用本地接口(Local Interface)从本地访问组件方面。但是概念上看没有改变很多—例如,本地接口还是接口。因此,本书就没有详细地讨论这些新特性。
.CORBA组件模型
CORBA(Common Object Request Broker Architecture,通用对象请求代理体系结构)是一个分布式对象基础设施的标准,一种面向对象的RPC(Remote Procedure Call,远程过程调用)。这个标准是由对象管理专家组(Object Management Group,OMG)定义的。OMG是一个非营利性组织,IT行业很多重要的公司都参加了这个组织。CORBA是一种独立于操作系统的编程语言,许多厂商提供了该标准的实现。除了低层的远程对象通信,CORBA还定义通用对象服务(Common Object Services, COS)来处理事务、异步事件、持久性、交易、命名,以及其他不为人们熟知的许多功能。
CORBA组件形成了一个构建于CORBA通信基础设施之上的组件体系结构。其规范是CORBA 3.0的一部分。虽然规范已经完成,在写规范时还没有商业实现可用,但已经有几家公司宣布了产品并正致力于CCM的实现。事实上,试验性的实现正在进行中,并且已经得到了早期成果[OPENCCM]。
CORBA组件模型(CCM)与EJB有许多共同特性,它实际是向上兼容的,人们希望将来这两种体系结构能够融合。
如前面所述,CCM仍很新颖,关于它的文献还不是很多。OMG[OMGCCM]的规范当然值得一读,而Jon Siegel的有关CORBA 3的书[SI00]也包含一章讨论CCM。
COM+
COM+是微软的组件基础设施的实现。它与Windows家族的操作系统紧密地集成在一起,其他操作系统则不能使用。COM+是Windows平台下的独立于编程语言的技术。
COM+实际上是由DCOM与微软事务服务器(Microsoft Transaction Server,MTS)集成之后取的新名称,与其名字的含义相反,它是一个组件的运行时环境。事务是由分布式事务协调器DTC管理的。DCOM本身是微软的桌面组件技术COM(Component Object Model,组件对象模型)的分布式版本。因此,与其他两种技术相比,COM+的历史较长。一方面这意味着它是一个被验证了的技术;另一方面,它有一些为了相容性而设置的奇怪特性。
市场上充斥着这方面的书籍。我们认为Alan Gordon的《The Com and Com+ Programming Primer》[GO00]是一本很好的入门书。
本书网站
用书籍作为交流知识的方式并非没有缺点。
主要有两个缺点:
?写书需要花很长时间。这就意味着到书出版时,书中的某些信息可能已经过时了,或者至少是不完整的。
?书是一种单向的传媒手段。没有直接的方式让读者反馈,或者进行讨论。
为了克服这些缺点,我们创建了网站www.servercomponentpatterns.org。它包含本书的源代码,相关网站的链接,联系作者和得到其他有用素材的方式。我们还用这个网站发布勘误表和新发现的模式。敬请浏览。
联系作者
我们很乐意收到你关于本书的意见,或者你可能有的其他任何评语。
用以下方式可以和作者联系:
?voelter@acm.org
?alex.schmid@t-online.de
?ewolff@mac.com
?给我们团体,用scp-book@yahoogroups.de
同本书的漫画作者Stefan Schulz联系,可通过sn.schulz@gmx.de。
漫画
写作这本书的过程中,我们在一个会议上展示了它的模式。我们想使演示轻松愉快一些,因此向为本公司工作的一位自由职业者咨询,是否能画一些漫画来表示这些模式,每个模式一幅。他做了,且效果非常好。于是我们进而说服他为书中的每个模式都画一幅漫画。
我们认为这些漫画有助于记住这些模式,因为它们用简单的图示抓住了每个模式的精华。同时,又形成了本书的特色。希望你能像我们一样喜欢这些漫画。你可以通过sn.schulz@gmx.de与画家Stefan Schulz联系。
符号和约定
与其他书一样,本书使用了一系列的符号和约定。事先理解这些约定很有用。
正文
正文,我们用5号宋体表示。模式使用特殊的格式,问题和解决方案小节使用仿宋字。本书中对其他模式的引用使用粗体表示模式名。本书以外的模式,包括可以找到这个模式的 [参考文献] 用楷体字。
源代码中的参数引用,或其他名字、标记或类型用斜体字表示。
源代码
对源代码来讲,我们用固定宽度的字体。我们没有声明例子中的源代码是完整的并且可编译。为了简短起见,我们省去所有不必要的细节。这些细节可能是一些导入语句、错误处理和其他我们认为不重要的代码—我们用省略符号(……)来标记省去的代码。为了简化代码例子还使用注释和伪码。
图
图略微复杂一些,因为在本书中使用不同的符号。对结构图来说,我们尽可能用UML图。例如,组件通常是以一个有附着接口的“类矩形”形式绘制的。下面的图表示有两个接口IFA1和IFA2的组件A。
对很多结构图来讲,特别是在第一部分,我们使用了非UML记号,因为UML在这里不大起作用,通过使用标准语句和注释将所有东西强制变成UML图,也没有什么好处。下图给出一个具有代表性的例子:
这种记号需要解释一下。这些图大致展示类似UML的协作图,虽然聚合通过真实的包含关系以及其他细节展示。下面的图例解释所使用的符号—剩下的内容等你在模式语境中看到图时就会清楚了。
为了说明交互,我们通常使用UML顺序图。
组件和实例
为了避免误解,必须澄清我们关于“组件的论述”的重要问题。用我们的术语来说,组件是被开发和部署的产物,而组件实例(或者简称实例)指的是组件特定的运行时实例化。与OO术语相比,组件对应类,组件实例对应于对象(它在某些语言中称为类实例)。在特别针对EJB的部分,我们分别使用Bean和Bean实例。
致谢
就像其他的书一样,除了封面上署名的人,还有很多人参与了本书的创作过程。关于模式的书更是这样。因此我们希望对下面的人说“谢谢”。
首先,我们感谢Frank Buschmann, 在这本书的创作过程中他担任了双重角色。第一,他是Wiley模式系列丛书的编辑,是他建议我们写这本书。其次,他是我们的指导者,给了我们很多有用的意见—作为一个有经验的模式作者和技术书籍作家,他深深理解本书所讲的技术,他的意见有真正的帮助。
第二,我们要感谢我们的雇主MATHEMA AG公司,特别感谢Hans-Joachim Heins和Michael Wiedeking,感谢他们对这个项目的支持。
第一部分中的模式(部分)已经提交EuroPLoP 2001讨论会。我们从那里的工作组收到了很多有用的反馈意见,我们要特别感谢Klaus Marquardt,他在大会上是我们的指导者,并为模式的早期版本提供了很多有用的建议。
当然,要特别感谢Stefan Schulz,没有他的漫画,这本书会逊色很多。为了在本书的最后期限之前完成,我们向他施加了巨大的压力,我们对他能够完成感到很高兴。
我们同样感谢Peter Sommerlad,他总是同我们唱反调,向我们提出了有关一般基于组件的开发方法的几个关键性的问题。也感谢Matjaz Juric, 他在书稿完成的最后阶段审阅了关于EJB的部分,并发现了几处错误和问题,特别是关于当时全新的EJB 2.0版。
还有来自其他很多人的意见,我们对他们的工作也表示感谢。这些人包括Jim Coplien、Costin Cozianu、Kristijan Cvetkovic、Jutta Eckstein、Erwin Hoesch、Matthias Hessler、Markus Schiller、Michael Kircher、Jan Materne、Markus Sp妕h、Thomas Neumann、Francis Pouatcha、Stephan Preis、Michael Schneider和Oliver Vogel。
非常感谢WordMongers公司的Steve Rickaby所做的编辑和排版工作。Steve的校正语言文字、格式和版面的工作做得很出色—经历了长时间的写作,我们已经没有精力亲自来做这些事情。非常感谢你!
最后同样重要的是,我们感谢John Wiley & Sons公司的Gaynor Redvers-Mutton,他很好地帮助我们进行与Wiley公司的组织协调工作。毕竟我们并不是每天在写书,尤其在写第一本书时,因此有人能够负责技术和管理问题会大有帮助。
Alexander Schmid感谢Gudrun Hauk的耐心和支持。如果没有她的鼓励,他对这本书的贡献就不会像现在一样。
Eberhard Wolff感谢Tanja Maritzen和他家庭的支持。没有他们的支持和耐心,他简直就不可能参与本书的写作。
Markus V歭ter
Alexander Schmid
Eberhard Wolff