本书分三部分讲述服务器端组件基础设施的原理和模式。第一部分介绍一种描述服务器端组件基础设施内部工作原理的模式语言,对于每种模式都提供用EJB、CCM和COM+实现的例子加以说明。第二部分使用EJB技术为每种模式提供了实现的详细实例。第三部分以对话形式讨论如何使用组件技术实现一个具体的应用。
本书既可作为软件工程教材又可作为参考指南,帮助软件开发人员理解服务器端组件基础设施的原理和模式,了解服务器端组件基础设施对实际应用的好处以及EJB、CCM和COM+之间的异同,全面认识EJB技术从而能够为具体的项目设计自己专用的组件。
本书是经典的“软件模式”系列中的一卷,讲述组件中的模式。在很多就用领域,Enterprise JavaBeans(EJB)、COM+和CORBA组件模型(CCM)等组件技术已经成为主流。在日常工作中使用这一技术的开发人员和架构师需要知道更多有关组件基础设施的知识,而不仅仅是每种技术的API。本书正是为此而撰写的。理解服务器端组件基础设施的原理和模式了解EJB,CCM和COM+之间的异同对EJB技术有全面的认识能够为具体的项目设计自己专用的组件
译者序\r\n序一\r\n序二\r\n前言\r\n基础知识 1\r\n什么是组件 1\r\n模式和模式语言 3\r\n组件体系结构的原理 7\r\n组件:是银弹吗 13\r\n第一部分 服务器组件模式语言 15\r\n模式语言图 16\r\n阅读模式语言的顺序 16\r\n一段对话 17\r\n\r\n第1章 核心基础元件 21\r\n1.1 组件 21\r\n1.2 容器 24\r\n1.3 服务组件 27\r\n1.4 实体组件 29\r\n1.5 会话组件 31\r\n1.6 小结 34\r\n\r\n第2章 组件实现构造块 37\r\n2.1 组件接口 37\r\n2.2 组件实现 40\r\n2.3 实现限制条件 43\r\n2.4 生命周期回调 45\r\n2.5 注释 48\r\n2.6 小结 51\r\n\r\n第3章 容器实现基础 53\r\n3.1 虚实例 53\r\n3.2 实例池调度 55\r\n3.3 钝化 58\r\n3.4 组件代理 61\r\n3.5 代码粘合层 63\r\n3.6 小结 65\r\n\r\n第4章 组件及其环境 69\r\n4.1 组件上下文 69\r\n4.2 命名 72\r\n4.3 组件局部命名上下文 74\r\n4.4 被管资源 76\r\n4.5 可插资源 78\r\n4.6 配置参数 80\r\n4.7 所需接口 82\r\n4.8 小结 84\r\n\r\n第5章 标识和管理实例 87\r\n5.1 组件HOME 87\r\n5.2 主键 90\r\n5.3 句柄 92\r\n5.4 小结 94\r\n\r\n第6章 远程访问组件 99\r\n6.1 组件总线 99\r\n6.2 调用上下文 103\r\n6.3 客户端代理 105\r\n6.4 客户库 107\r\n6.5 客户引用合作 109\r\n6.6 小结 111\r\n\r\n第7章 容器的进一步实现 113\r\n7.1 系统错误 113\r\n7.2 组件自查 116\r\n7.3 实现插件 117\r\n7.4 小结 119\r\n\r\n第8章 组件部署 121\r\n8.1 组件安装 121\r\n8.2 组件包 124\r\n8.3 装配包 126\r\n8.4 应用程序服务器 127\r\n8.5 小结 129\r\n第二部分 用EJB描述的模式 131\r\n\r\n第9章 EJB核心基础元件 133\r\n9.1 组件 133\r\n9.2 容器 133\r\n9.2.1 管理资源 134\r\n9.2.2 持久性 134\r\n9.2.3 安全性 135\r\n9.2.4 事务 135\r\n9.2.5 其他特性 135\r\n9.3 服务组件 136\r\n9.4 实体组件 138\r\n9.4.1 什么是实体Bean 138\r\n9.4.2 技术观点 139\r\n9.5 会话组件 142\r\n\r\n第10章 EJB组件实现构造块 145\r\n10.1 组件接口 145\r\n10.2 组件实现 150\r\n10.3 实现的限制 152\r\n10.3.1 限制条件 152\r\n10.3.2 检查这些限制条件 154\r\n10.4 生命周期回调 154\r\n10.4.1 无状态会话Bean 154\r\n10.4.2 消息驱动Bean 156\r\n10.4.3 有状态会话Bean 158\r\n10.4.4 实体Bean 161\r\n10.5 注释 166\r\n10.5.1 标准部署描述文件的内容 167\r\n10.5.2 销售商相关的典型内容 169\r\n\r\n第11章 EJB容器实现基础 171\r\n11.1 虚实例 171\r\n11.2 实例池调度 171\r\n11.2.1 无状态会话Bean的池调度 172\r\n11.2.2 实体Bean的池调度 173\r\n11.3 钝化 175\r\n11.3.1 钝化Bean实例 175\r\n11.3.2 钝化实例的重激活 176\r\n11.4 组件代理 177\r\n11.5 代码粘合层 179\r\n\r\n第12章 EJB Bean及其环境 181\r\n12.1 组件上下文 181\r\n12.2 命名 185\r\n12.3 组件局部命名上下文 187\r\n12.4 被管资源 188\r\n12.4.1 资源池调度 188\r\n12.4.2 资源工厂 189\r\n12.4.3 与技术问题的集成 192\r\n12.5 可插资源 192\r\n12.6 配置参数 194\r\n12.7 所需接口 195\r\n\r\n第13章 标识和管理Bean实例 197\r\n13.1 组件HOME 197\r\n13.1.1 不同类型Bean的Home操作 198\r\n13.1.2 本地Home 202\r\n13.1.3 Home业务方法 203\r\n13.1.4 使用Home接口 203\r\n13.2 主键 203\r\n13.3 句柄 206\r\n\r\n第14章 远程访问Bean 209\r\n14.1 组件总线 209\r\n14.1.1 使用JRMP作为传输协议 210\r\n14.1.2 使用IIOP作为传输协议 210\r\n14.1.3 其他协议 211\r\n14.1.4 本地调用 211\r\n14.1.5 异步调用 211\r\n14.1.6 实现选项 211\r\n14.2 调用上下文 213\r\n14.3 客户端代理 214\r\n14.4 客户库 215\r\n14.5 客户引用合作 216\r\n\r\n第15章 进一步的EJB容器实现 219\r\n15.1 系统错误 219\r\n15.1.1 系统错误 219\r\n15.1.2 应用错误 221\r\n15.2 组件自查 222\r\n15.3 实现插件 223\r\n\r\n第16章 Bean部署 225\r\n16.1 组件安装 225\r\n16.2 组件包 226\r\n16.3 装配包 227\r\n16.4 应用程序服务器 228\r\n第三部分 一个故事 229\r\n参考文献和在线资源 261\r\n术语表 271
本书的内容
本书阐述如何在服务器上进行基于组件的开发. 这些技术的例子包括当前得到广泛应用的企业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 Volter
Alexander Schmid
Eberhard Wolff