本书作者是世界上EJB设计模式领域内的卓越专家,他领导着EJB设计模式项目。本书不仅从理论上对设计模式在EJB上的应用进行了深入的探讨,而且通过实例展示了EJB设计模式的魅力。本书提出的模式都可以应用于实际项目中。阅读本书可以极大地拓展开发人员的思路,大幅度地提高开发人员构建应用系统的水平,提高代码的重用性,从而提高代码的质量。本书适合有一定经验的应用开发人员参考。\r\n 'EJB设计的任务宏大而艰深,Floyd Marinescu以优雅而简洁的方式深刻而精辟地阐述了这个主\r\n\r\n题。我向所有EJB开发人员推荐本书。” --Richard Monson-Haefel\r\n\r\n 《Enterprise JavaBeans,Third Edition》一书的作者\r\n\r\n 本书不仅是高级设计模式的最佳指南,而且解决了EJB实现的关键问题。本书包括了20多个高级\r\n\r\nEJB设计模式,还提供了使用EJB设计模式的策略,J2EE开发的最佳实例,以及非常实用的EJB设计技\r\n\r\n巧和技术。\r\n\r\n本书还包括以下内容:\r\n\r\n ●架构模式、事务和持久性模式、客户端交互模式、主键生成策略\r\n\r\n ●用Ant构建系统的最佳实践\r\n\r\n ●JUnit测试策略\r\n\r\n ●如何使用JDO和EJB作为企业bean的替代工具\r\n
\r\n
译者序\r\n序言\r\n前言\r\n致谢\r\n关于作者\r\n第一部分 EJB模式语言\r\n第1章 EJB层次构架模式 2\r\n1.1 会话外观(Session Fa峚de) 3\r\n1.2 消息外观(Message Fa峚de) 9\r\n1.3 EJB 命令(EJB Command) 14\r\n1.4 数据传送对象工厂(Data Transfer\r\nObject Factory) 20\r\n1.5 通用属性访问(Generic Attribute\r\nAccess) 25\r\n1.6 业务接口(Business Interface) 31\r\n第2章 层间数据传送模式 35\r\n2.1 数据传送对象(DTO) 35\r\n2.2 域数据传送对象(Domain Dto) 39\r\n2.3 定制数据传送对象(Custom DTO) 43\r\n2.4 数据传送散列映像(Data Transfer\r\nHashMap) 45\r\n2.5 数据传送行集(Data Transfer RowSet) 48\r\n第3章 事务和持久性模式 53\r\n3.1 版本号 53\r\n3.2 用JDBC 读取数据 59\r\n3.3 数据访问命令bean 63\r\n3.4 双重持久性实体bean 69\r\n第4章 客户端EJB交互模式 72\r\n4.1 EJBHome工厂 72\r\n4.2 业务代理 77\r\n第5章 主键生成策略 83\r\n5.1 序列块 83\r\n5.2 EJB的全局惟一标识符 89\r\n5.3 自动生成键的存储过程 93\r\n第二部分 EJB设计与实现的最佳实践\r\n第6章 从需求到模式驱动的设计 98\r\n6.1 TheServerSide论坛消息系统用例 98\r\n6.2 设计问题和术语的快速回顾 100\r\n6.2.1 什么是域模型 100\r\n6.2.2 理解J2EE系统中的层 101\r\n6.3 模式驱动EJB架构 103\r\n6.4 服务层模式 107\r\n6.4.1 异步用例 107\r\n6.4.2 同步用例 107\r\n6.4.3 其他服务层模式 109\r\n6.5 层间数据传送模式 110\r\n6.6 应用层模式 113\r\n6.7 小结 114\r\n第7章 EJB开发过程:用Ant构建, 用\r\nJunit单元测试 115\r\n7.1 开发顺序 115\r\n7.1.1 独立于层的编码 117\r\n7.1.2 首先是域层 117\r\n7.1.3 其次是持久层 118\r\n7.1.4 第三是服务层 119\r\n7.1.5 最后是客户端层 119\r\n7.2 自动化环境: 用Ant管理 120\r\n7.2.1 什么是J2EE应用环境 120\r\n7.2.2 管理J2EE应用环境意味着什么 120\r\n7.2.3 使用Ant 122\r\n7.3 用JUnit进行单元测试 136\r\n7.4 小结 144\r\n第8章 实体bean的替代品 146\r\n8.1 实体bean的特性 146\r\n8.2 实体bean和认知差异 147\r\n8.3 捍卫实体bean 148\r\n8.4 实体bean的替代品简介 149\r\n8.4.1 使用直接JDBC操作/存储过程 150\r\n8.4.2 使用第三方的O/R映像产品 150\r\n8.4.3 构建定制的持久性框架 150\r\n8.4.4 使用java数据对象 150\r\n8.5 Java数据对象简介 151\r\n8.5.1 需要的类及其依赖关系 151\r\n8.5.2 构建和部署过程 152\r\n8.5.3 继承 153\r\n8.5.4 客户端API 154\r\n8.5.5 动态与静态的查找机制 154\r\n8.6 EJB开发者使用JDO的指南 154\r\n8.6.1 准备EJB环境 155\r\n8.6.2 配置会话bean 155\r\n8.6.3 执行用例和事务管理 156\r\n8.6.4 容器管理的事务 156\r\n8.6.5 bean管理的事务 158\r\n8.6.6 缓存/惰性加载和引用定位 159\r\n8.6.7 查找JDO 159\r\n8.6.8 层间数据传送 161\r\n8.7 小结 162\r\n第9章 EJB的设计策略. 习惯用语和\r\n技巧 163\r\n9.1 不使用组合实体bean模式 163\r\n9.2 采用Field命名惯例以允许在EJB 2.0\r\nCMP 实体bean中执行数据确认 164\r\n9.3 不要在实体bean上Get和Set值/数据\r\n传送对象 164\r\n9.4 如果能够被正确使用, 就可以使用\r\nJava的Singleton类 164\r\n9.5 使用预定更新而不是实时计算 165\r\n9.6 使用一个被序列化的java类来将编译器\r\n类型检查添加到与消息驱动bean的交互\r\n操作中 166\r\n9.7 在发生应用异常时总是调用setRollback\r\nOnly 166\r\n9.8 限制传递给ejbCreate的参数 167\r\n9.9 不要在ejbCreate中使用数据传送对象 167\r\n9.10 不要使用XML作为一种DTO机制来\r\n进行通信, 除非确实需要使用它 168\r\n附录 模式代码清单 169\r\n参考文献 204 \r\n
\r\n
译 者 序
随着J2EE/EJB技术的日益流行, 越来越多的企业选择使用J2EE/EJB技术来构建应用系统. 但是, J2EE/EJB技术比较复杂, 如何构建高效. 安全和可靠的基于J2EE/EJB的企业应用系统是软件开发者要面临的一个挑战. 很多有经验的EJB系统开发人员在他们的实践过程中总结出了许多可以提高系统性能的用于EJB编程的可复用方法, 从而形成了EJB设计模式. 这些设计模式可以帮助其他的EJB开发人员提高项目的质量, 缩短项目的开发周期. 但是EJB设计模式种类众多, 所针对的问题各不相同, 在解决问题时的侧重点也不尽相同. 因此需要对它们进行分类整理, 综合分析, 使EJB开发人员能够在实际项目中选择最合适的设计模式.
本书正是以这种方法来介绍EJB设计模式的. 这本书分为两大部分, 第一部分介绍了EJB设计模式语言, 包括系统架构设计模式. 层间数据传输模式. 事务和持久性模式. 客户端EJB交互模式以及主键生成策略等, 第二部分介绍了从需求到模式驱动的设计. 用Ant编译与用JUnit进行单元测试的EJB开发过程. 实体Bean的替代物以及众多的灵活小巧的设计技巧等. 这本书通俗易懂, 书中述及的EJB设计模式都是从实际的EJB项目中抽取出来的, 所以它们非常实用.
本书的作者Floyd Marinescu是EJB设计模式方面的著名专家, 他领导了EJB设计模式项目, 并且和另外一名EJB领域的专家Ed Roman一起成立了一家培训和咨询公司, 以帮助开发者掌握J2EE技术.
我们在翻译本书的过程中力求忠于原著, 对于本书中出现的大量的专业术语尽量遵循标准的译法, 并在有可能引起歧义之处标注了英文原文, 以方便读者对照理解.
全书的翻译由饶若楠. 陈昊鹏和张保稳合作完成. 由于我们水平有限, 书中出现错误与不妥之处在所难免, 恳请读者批评指正.
关于作者
Floyd Marinescu是EJB设计模式方面的顶尖专家之一. 他构建了TheServerSide.com—世界级领先的J2EE社团Web站点, 并使其投入了运行. Floyd编写了大量的EJB设计模式, 并且和社团一道努力工作, 从而获得了EJB的最佳经验. 他撰写了大量的论文, 并在主要的Java会议频频亮相. Floyd同时也为中间件公司(www.middleware-company.com)工作, 该公司是一家在EJB 和J2EE方面的培训和咨询公司. 读者可以通过floyd@middleware-company. com和他取得联系.
关于为本书作出贡献的人
Randy Stafford是一个在软件开发的许多方面都很精通的专
前 言
这本书关系到软件开发人员的生活质量. 无论开发者. 系统架构师还是项目经理, 在一天结束的时候, 都会为在构建和发布设计精良的应用时没有产生代价高昂的错误. 没有工作到深夜和没有经历那种长达数月的压力而感到高兴. 我们都是普通人, 都希望在一天结束的时候看到项目在按进度进行, 并且回家后有充足的时间去干我们喜欢干的事情.
然而, 当使用诸如Java 2 Enterprise Edition(J2EE)这类正处在发展阶段的新技术时, 设计精良的应用并不容易做到. 在这类相对较新的领域中, 总是非常缺乏有关设计优良系统的知识. 开发者要么效率低下地从头开始努力学习, 要么每天都在项目上产生很多代价高昂的错误. 如果没有一些有条理的最佳经验可遵循, EJB开发者的工作将十分艰苦. 学习优良的设计方法在技术上对于初学者来说尤其困难, 他们中的许多人在这之前从来就没有构建过分布式系统, 也不清楚影响分布式系统设计的最基本需求.
更糟的是, EJB规范从一个版本到另一个版本的变化总是会给在设计优良的EJB系统时所使用的设计方式带来显著的变化. 特别是随着EJB 2.0规范的引入, 甚至在大多数最近出版的有关EJB的书中所讨论的多年来积累的最佳经验都将不再适用, 或者达不到相同的目的了, 使用这样的最佳经验可能导致设计出的系统非常拙劣.
我们编写本书(中间件公司的“EJB for Architects”课程也讲授这本书中所描述的模式)为的是传播精妙的设计思想, 提高开发者的设计质量, 从而提高开发者自己的生活质量, 我们的最终目的是希望帮助读者学习当今业界中顶尖的设计方法, 以便快速地设计出高效的. 可扩展的和可维护的系统.
我们希望使用模式(Pattern)这种机制来给读者传授设计知识.
什么是模式
模式是对常见的重复出现问题的最佳解决方案. 也就是说, 模式说明并解释了在设计和实现应用时所产生的重要的或者是具有挑战性的问题, 并且讨论了对这个问题的最佳解决方案. 随着时间的推移, 模式开始体现出产生它的业界的集体智慧和经验. 例如, 本书中的模式呈现了成千上万的来自TheServerSide和业界的EJB开发者的智慧, 他们的意见和评论为本书提供了很好的素材.
模式的优点
模式当然有很多的用处, 但是下面这些优点对于帮助诸如J2EE这样的新软件平台尽快成熟具有重要意义:
为讨论设计问题提供高级语言. EJB开发者可以使用本书中的模式名字来高效地讨论实现细节. 想象一下, 描述一个应用是使用无状态会话外观(stateless session fa峚de)模式构建的比设法解释会话bean怎样包装实体bean 的所有语义要快许多.
预先提供了许多设计工作. 一个描述完备的模式详细讨论了需要解决的问题, 并且通过正反两方面的讨论, 说明了问题应该如何解决, 以及其他应该了解的问题. 通过研读模式, 可以预先讨论和考虑许多具有挑战性的并且是潜在的深层问题.
模式的组合有助于导出可复用的体系结构. 模式总是在彼此之间互相引用和依赖. 这种模式之间的连接创造了模式语言(pattern language):即一系列互联的模式, 它们整体上常常代表了应用的完整的体系结构. 这样, 当阅读本书时, 某些互联模式的集合将形成可以被反复应用于多个项目的可复用的体系结构.
在本书中, 我们重点选取了非常底层的与EJB相关的模式, 也就是说, 本书不关心那些可以应用于多种技术的通用的抽象模式, 我们重点描述EJB模式, 讨论与具体EJB相关的问题和复杂的实现方法. 这样, 在本书中, 我们与许多其他的通常是说明一个模式的具体实现的模式书籍不同(那些模式不是与具体的项目相关的), 我们的目标是为EJB开发者或架构师提供在基于EJB/J2EE的应用中使用这些模式所必需的所有信息.
模式的起源
对许多人来说, 首次接触模式都是通过里程碑式的经典著作《设计模式:可复用面向对象软件的基础》(design pattern: elements of reusable object-oriented software, Gamma,et al,1994, 这本书已由机械工业出版社引进出版). 尽管这本书并不是第一本关于软件模式的书, 但该书对于将模式的概念和使用引入到了软件开发的主流中去起到了不可估量的作用.
模式的实际起源要远早于1994年. 模式是Christopher Alexander第一个描述的, 并且在20世纪70年代应用于城镇和建筑物的结构/体系中. 在《A Pattern Language》(建筑模式语言, 1977年)这本书中, Alexander写道:“每一个模式都描述了在我们周围的环境中一次又一次地重复发生的问题, 并且描述了对这个问题的解决方案的核心内容, 这样我们就可以成百万次地使用这个解决方案而又不会老调重弹. ”
模式是用来组织在生活中任何领域内的知识和解决方案的优秀方法, 而不仅仅限于民用工程和软件设计领域. 模式的结构和本性使它们能够很好地适用于对知识进行分类. 好的模式不仅说明了解决问题的方法, 而且以一种有助于解释问题的特征及其解决方案的形式组织起来.
本书中使用的模式描述风格
本书采用了一种与Alexander所使用的. 称为Alexandrian 形式(Alexan-drian form)的类似原始样式的风格来描述模式. 我使用的格式为叙述风格, 分为问题和解决方案等如下的几个段落:
?语境(context):描述有关模式应用语境.
?问题(problem):一个问题, 用来说明这个设计模式将要解决的难题.
?限制(forces):详细解释语境和问题的若干段落, 解释了在需要一个解决方案的工作中所存在的许多限制, 这里读者将完全理解为什么需要这个模式.
?解决方案(solution):用于介绍作为上面所描述问题的解决方案的模式.
?解决方案描述(solution description):描述这个解决方案的若干段落, 包括从正反两方面. 从高层到低层对模式和在EJB中的实现问题的解释.
相关的模式
“相关的模式”部分会交叉引用这本书中的其他模式, 或其他资源中相同或相似的模式, “参考文献”部分详细介绍了其他资源.
本书使用叙述风格而非要点陈述风格来描述模式, 这使得在本书中用到的Alexandrian风格与大多数其他流行的软件模式书籍不同. 本书的目标之一就是使有经验的架构师和初学者都可以读懂一个模式并且完全理解它. 我努力实现这个目标的方法是采用流畅的叙述风格, 把读者由问题引导到解决方案, 在所有的必要点上都一步一步地解释, 强调的是以一种简单而愉快的方式学习模式.
在使用非Alexandrian风格时, 往往会把模式分解为彼此互相分离的部分, 其中每一部分都使用要点陈述风格进行描述. 我认为采用这种风格是为了把尽可能多的信息打包在每一个要点中, 这使得阅读和理解变得很困难, 因为这些信息更适合于参考而非适合于最终阅读. 因此这样的模式书籍更适合于参考, 但是本书的目标是同时将模式教授给有经验的架构师以及没有经验的开发者, 所以必须选择一种有助于学习的描述风格, Alexandrian风格是最佳之选.
本书的组织
本书在组织上可以分为两部分:第一部分“EJB模式语言”是EJB模式的目录, 详细介绍了20种模式, 第二部分“EJB设计和实现的最佳实践”包括围绕其他主题(例如模式的应用和实现基于EJB的实际系统等)讲授最佳方法的若干章节. 我们的目标不仅是要给读者一个模式的目录, 还要给读者掌握这些模式的知识和完成工作所必需的工具. 在第二部分同时还包括一个用于描述实体bean的替代品的章节, 它给EJB开发者提供了使用java数据对象(Java Data Object, JDO)来持久化一个对象模型的前景, 还有一章描述了粒度更细的, 因为其太小而难以成为一个完整模式的设计技巧和策略.
本书的读者
本书深入讨论高级EJB话题, 所以我们假设读者在读本书之前已经对EJB的基础知识有了很好的了解. 我特别推荐Ed Roman的《Mastering Enterprise JavaBeans, Second Edition》(Wiley 2001), 它是一本学习EJB基础知识和高级应用的优秀书籍. 本书最初是Ed Roman的书中的一章, 但是由于其内容不断地增加, 于是我们决定将它独立成书. 获得掌握本书内容所需背景的另一个途径是参加由中间件公司提供的Mastering EJB课程或者EJB for Architects课程来学习这本书中所有的模式.
尽管这本书要求读者要了解有关EJB的知识, 但它并不是仅针对有经验的架构师的. 这本书的风格也适合于入门级的读者. 特别是, 在这本书的撰写过程中我们遵从了下面三个原则:
1) 某些刚刚读过Ed Roman的《Mastering Enterprise JavaBeans, Second Edition》或其他EJB书籍的读者应该能够在没有什么太多困难的情况下就可通读和掌握这些概念.
2) 本书内容的核心程度和技术深度即使对专家也颇有吸引力.
3) 本书的每一部分所回答的问题都比它提出的问题要多得多.
这三条原则是这本书的灵魂, 原则3)可以保证我们提供在解释一个令人费解的话题时所必需的背景知识, 而原则1)还使得本书重复了一些对EJB的介绍性的内容, 原则2)则保证我们重点讨论那些在别的书中通常没有提到的. 然而却是最有用和最重要的话题.
相关Web站点
与本书相伴的Web站点:www.theserverside.com/pattern/ejbpatterns, 包含了这本书中运行和编译的源代码例子, 以及一个读者论坛. 这个Web站点将很有希望不断地发展下去, 因为随着时间的推移, 读者会不断地向这个Web站点加入更多的模式.
小结
本书与任何其他的模式书不同. 你将不仅学习到很多有价值的. 基础的模式, 它们可以帮助你提高所编写的基于EJB的应用的质量, 而且还将学习到怎样去接受这些模式的知识并以用例驱动的方式应用它们. 同时, 你将学习到许多关于如何去实现已经完成设计的应用的最佳方法.
如果本书对你的事业和你正在从事的项目的质量有所贡献的话, 我将非常欣慰. 如果本书能够通过提高你的项目的效率从而使你的整个生活质量有所提高, 那么它就超额完成了任务.