本书是一本实践指南,它围绕POJO(普通Java对象)构造了一个完整的应用程序,对框架之间的各种组合进行了详细的举例说明;描述了在采用POJO和轻量级框架如Hibernate、Spring时,如何制定主要设计决策,包括怎样组织和封装业务逻辑、访问数据库、管理事务以及如何处理数据库并发等。此外,本书还详尽地分析了事务管理、悲观锁、乐观锁、条件组合搜索等难点问题。\r\n 本书适用于已经掌握企业Java开发基础,愿意学习如何有效地使用POJO和轻量级框架,渴望突破和提高的开发人员和架构师。
第一部分 POJO及轻量级框架概述\r\n 第1章 用POJO进行开发:更快捷更简单\r\n 1.1 EJB幻灭\r\n 1.2 用POJO进行开发\r\n 1.3 小结\r\n 第2章 J2EE设计决策\r\n 2.1 业务逻辑和数据库访问决策\r\n 2.2 决策1:组织业务逻辑\r\n 2.3 决策2:封装业务逻辑\r\n 2.4 决策3:访问数据库\r\n 2.5 决策4:处理数据库事务中的并发\r\n 2.6 决策5:处理长事务中的并发\r\n 2.7 在项目中作出设计决策\r\n 2.8 小结\r\n第二部分 更简单、更快捷的方案\r\n 第3章 使用Domain Model模式\r\n 3.1 理解领域模型模式\r\n 3.2 开发领域模型\r\n 3.3 实现领域模型:示例\r\n 3.4 小结\r\n 第4章 持久化领域模型概述\r\n 4.1 将对象模型映射到数据库\r\n 4.2 ORM框架概述\r\n 4.3 JDO和Hibernate概述\r\n 4.4 用Spring设计仓库\r\n 4.5 测试持久领域模型\r\n 4.6 JDO和Hibernate的性能优化\r\n 4.7 示例模式\r\n 4.8 小结\r\n 第5章 用JDO 2.0持久化领域模型\r\n 第6章 用Hibernate 3持久化领域模型\r\n 第7章 用POJO facade封装业务逻辑\r\n第三部分 变体\r\n 第8章 使用暴露领域模型\r\n 第9章 使用Transaction Script模式\r\n 第10章 用EJB3实现POJO\r\n第四部分 处理数据库和并发\r\n 第11章 实现动态分页查询\r\n 第12章 数据库事务和并发\r\n 第13章 使用离线锁模式
业界流传着一本经典的架构书籍——Martin Fowler的《企业架构模式》。《POJOs IN ACTION中文版》这本书可以看作是《企业架构模式》的深化进阶篇,它详细讲解了《企业架构模式》语焉不详的一些重要架构模式实战。读通了本书,您就可以和别人交流一些具有相当复杂度的高级企业应用模式了。
我对本书涉及的技术方面比较熟悉,因此在这里写这篇序。《POJOs IN ACTION中文版》的主线是如何用Spring、iBATIS、Hibernate、JDO、EJB 3等流行框架搭建无侵入的Web三层构架。POJO(Plain Old Java Object)的含义已经超越了字面的意思,成为“无侵入”特性的代名词。“无侵入”的具体含义是:用户的业务逻辑代码不依赖于具体应用框架代码;更换或者升级持久层框架时,不需要修改原来的业务逻辑代码。
看过本书,读者会对一些流行词(IoC、AOP、Open Session In View、事务管理、悲观锁、乐观锁等)有深入的了解和掌握。本书作者对Spring IoC、Hibernate、JDO、EJB 3等框架非常熟悉,他熟知各种边边角角的高级用法,解决了很多架构上的难点。
本书构造了一个完整的应用程序,并对框架之间的各种组合进行了详细的举例说明——什么样的需求,适合采用什么样的框架组合。这与开源项目Appfuse有些类似,不同的是,本书例子的深度和难度都高于Appfuse。
实战(In Action)系列书籍的时效性是读者购书时关心的问题之一。本书既然以具体框架应用代码为例,自然也存在一定的时效性问题。比如,EJB 3的新持久化标准为JPA;其他一些框架也会不断地升级。幸运的是,本书作者的数据库基本功非常深厚,尤其在本书最后3章,表现得淋漓尽致。笔者认为,最后3章最为出彩,是本书的精华所在。作者将事务管理、悲观锁、乐观锁、条件组合搜索等难点都分析得鞭辟入里、头头是道。强烈推荐,值得一读。
当然,前面的章节也不错。IoC、AOP、Open Session In View等概念深入浅出,用例翔实。读者跟着本书实践一遍,充当一个Java应用程序架构师应已基本够用。书中各种框架的特性对比,对于框架应用设计人员而言,更是难得的珍贵资料。架构师可以根据具体需求,对框架进行组合、剪裁、模仿和改进。因此,在深度和广度上的这些优点一定程度上延长了本书的时效。
读者(尤其是渴望突破和提高的程序员)可以先翻阅最后3章(精华所在,详细讲解了其他书籍语焉不详的难点)。我相信,您一定会被作者的务实风格和深厚功底所吸引。
琳骁和我合作翻译了这本书。琳骁翻译了前8章,我翻译了后5章。这是我第一次翻译书稿,内心忐忑不安。深恐翻译有错漏,被读者骂还是小事,浪费了读者的时间和金钱才是大事。幸运的是,本书的主要译者琳骁是一位认真负责且有经验的译者,他对整个译文进行了多次仔细的检查和润色,解决了很多行文的通顺问题,令我受益匪浅。
祝愿各位读者能享受阅读本书的乐趣。
王海龙
于2007年2月13日
Chris Richardson是位开发人员和架构师,他拥有超过20年的开发经验。他的咨询公司擅长启动新项目和指导开发团队。Chris曾在Insignia、BEA及其他公司担任技术主管。他拥有英国剑桥大学的计算机科学学士和硕士学位,目前住在加利福尼亚的奥克兰。
POJOs in Action 是本实践指南,它介绍如何使用POJO和轻量级框架开发企业Java应用程序的后端逻辑(back-end logic)。这些技术能显著简化应用程序业务层和表示层的构建过程,因此相当重要。本书内容涵盖了主要的轻量级框架:Spring、JDO、Hibernate和iBATIS。此外还包括EJB 3,它吸收了POJO及轻量级框架的一些特性。
在本书里,你将学习如何在企业Java应用程序中实践测试驱动开发和对象设计。本书采用一个真实的用例,举例说明怎样用POJO和轻量级框架进行开发,这个用例取自一个贯穿全书的示例应用程序。本书还用多种方法实现了同一个用例,便于你认清这些方法之间的本质区别。
POJOs in Action 一书的核心要旨是每种技术都有优点和缺点。本书将向你讲授采用及不采用上述各种框架的时机。例如,尽管全书的重点在于Spring框架和POJO,不过本书也描述了何时采用EJB才有意义。此外还阐述了何时应该使用面向对象设计和O/R映射(ORM)框架,以及什么时候应当直接使用过程式设计和SQL。这也是POJOs in Action 和其他大量图书的本质区别,后者常常一味地提倡使用他们自己偏爱的框架。
企业Java框架也一直在不断地演变。在写作本书期间,我描述的所有框架就已发布了好几个新版本。EJB 3也已浮出水面,尽管仍处于草稿阶段。而且从本书付印到你阅读本书的这段时间里,一些企业Java框架还将进一步演变。不过好消息是本书仍能派上用场,毕竟POJO和非侵入性轻量级框架没那么容易过时。
无论框架怎么演变,一些核心概念仍将保持不变。首先,你应客观评价框架的优点和缺点,不要被精明的市场行销所迷惑,这一点至关重要。其次,POJO和非侵入性框架都是好东西。你应当避免将自己的业务逻辑与基础框架耦合在一起,尤其是这样做会延缓编辑-编译-调试周期的时候。第三,测试必不可少。如果不编写测试,你就无法保证自己的应用程序能正常工作。而且你必须会编写测试,因此可测试性设计也非常重要。最后,正如阿尔伯特•爱因斯坦所言,“一切都应该尽可能地简单,但是不要过于简单”。
路线图
本书共由4部分组成。第一部分是POJO和轻量级框架概述,并探讨在开发企业Java应用程序时,你必须做出的主要设计决策。第1章介绍POJO和轻量级框架的相关概念。在这一章,你将学习POJO设计和旧式EJB 2设计之间的主要区别。这一章描述了面向对象设计的优点。你还将探究一个简单的应用程序,该程序使用Hibernate持久化POJO,并通过Spring使它们具有事务性。
第2章描述在开发企业Java应用程序的后端逻辑过程中,你必须做出的设计决策。有些决策关乎轻量级框架和EJB两者之间的取舍。其他决策则是不同轻量级框架之间的选择,比如应该使用ORM框架访问数据库还是用iBATIS直接执行SQL。此外,你还需要做出其他决策,这些决策和你采用哪种技术无关,例如怎样组织业务逻辑,如何处理数据库并发等。这一章概述了你必须做出的设计决策,以及可供你选择的选项。我们还介绍了贯穿全书的示例应用程序及其用例,供我们在探讨设计选择时使用。
第二部分描述了一种简单但非常有效的企业Java应用程序设计方法,而且适用于多数企业Java应用程序。这种设计用面向对象的领域模型实现业务逻辑,并通过ORM框架如JDO或Hibernate持久化对象,此外使用POJO façade而非EJB session façade封装业务逻辑。由于具备诸多优点(包括易于开发和测试等),因此只要可能我会优先采用这种方法。
运用这种设计的第一步是开发一个领域模型。领域模型是应对大量企业Java应用程序中复杂业务逻辑的极好方式。第3章描述了怎样使用POJO领域模型实现业务逻辑。你将了解领域模型的组织结构及采用领域模型的优缺点。我们还阐述了如何通过应用程序的需求分析以及与业务专家的交谈,来识别领域模型里的类、成员变量和关系。然后,我们会向你展示如何用测试驱动开发技术来实现领域服务和实体。你将学习在没有数据库的情况下,如何使用模拟对象测试领域模型,这能极大地简化测试。这一章通过取自示例应用程序的“下订单”(Place Order)用例说明了怎样开发领域模型。
一旦完成领域模型的开发,你就需要持久化领域模型。通常,持久化领域模型的最佳途径是使用ORM框架,它能将对象透明地映射到数据库。第4章概述了ORM框架。在这一章,你将学习克服数据库模式 和领域模型之间阻抗不匹配的策略。我们描述了怎样将领域模型里的类、成员变量和关系映射到数据库模式,并列出了ORM框架的主要特性。你将学习到有效的持久层测试策略。这一章还介绍了两个流行的ORM框架——Hibernate和JDO,并描述了如何使用Spring ORM类实现访问数据库的应用程序类。
JDO是来自Sun公司的ORM标准,在写作本书时,该规范的第二个版本已接近完成。第5章阐述了怎样使用JDO 2持久化在第3章中开发的领域模型。我们描述了你将遇到的种种问题,以及使用JDO时必须做出的决策。你将学习如何使用JDO持久化对象,怎样用Spring的JDO支持类实现领域模型仓库(repository)(数据访问对象)。我们还阐述了如何对JDO持久层进行有效的测试,并列举了一些能提升JDO应用程序性能的方法。
第6章描述了怎样使用Hibernate持久化在第3章中开发的领域模型,Hibernate是个非常流行的开源框架。你将了解使用Hibernate时会遇到的种种难题和限制。我们阐述了怎样用Spring的Hibernate支持类实现仓库。此外,你将学习怎样对Hibernate持久层进行有效的测试。本章还分析了一些能提升Hibernate应用程序性能的方法。
封装业务逻辑是这一过程的最后一步。标准的EJB做法是使用EJB session façade,并向表示层返回DTO。但是开发EJB和编写DTO可能会相当繁琐枯燥。幸好,还有更好的方法。第7章描述了怎样用POJO façade封装业务逻辑,这样做更易于开发和测试。你将了解Spring框架怎样提供一种很便利的方式来实现声明型安全和事务。此外,你还将学习怎样使用所谓的JDO和Hibernate脱管对象向表示层返回数据,从而无需再编写大量DTO。
第二部分描述的做法是设计业务逻辑和访问数据库的有效途径,不过它并非唯一选择。第三部分提供了设计企业应用程序业务层和表示层的替代做法。第8章描述了当业务层和表示层在同一个JVM里运行时,怎样省却façade之需。尽管把领域模型暴露给表示层也许听似异端,但这样做有诸多好处。由于没有façade,因此需要编写和维护的代码会更少,它还避免了使用脱管对象时潜在的一些问题。不过你会发现,要使用这种做法,你必须解决一些棘手的数据库连接和事务管理问题。
就采用面向对象设计实现领域逻辑及使用ORM框架持久化对象来说,我是个忠实拥趸。但在有些情况下,使用这种做法并不明智。在第9章你将学习何时应考虑采用过程式设计实现业务逻辑。我们描述了怎样从用例出发开发一个过程式业务逻辑,以及怎样组织业务逻辑,使其更易维护。你将学习怎样通过Spring的iBATIS支持类来访问数据库。
对EJB的不满促使Java社区转而采用其他框架,比如Spring、Hibernate和JDO。作为回应,EJB也在不断变,演并吸收了POJO和轻量级框架的大量概念。第10章介绍了EJB 3,并与JDO、Hibernate和Spring进行比较。你将探究EJB 3的优点和缺点。我们描述了怎样使用EJB 3持久化第2章开发的领域模型,并列举了一些重大限制。我们还分析了以EJB 3会话bean实现第7章开发的session façade。你将学习怎样使用EJB 3的依赖注入组装应用程序。这一章还阐述了如何集成EJB 3和Spring的依赖注入。
本书第四部分探讨了一些重要的数据库相关问题,在开发企业Java应用程序过程中,这些问题都是你必须解决的。首先,第11章考察了搜索窗口(search screen)的实现,用户可以在页面里输入搜索条件,然后按页浏览所有匹配的结果。搜索窗口的实现颇具挑战性;应用程序必须能够高效查询数据库,并允许用户按页浏览一个庞大的结果集。它还必须以一种可维护的方式动态生成查询。在这一章,你将学习怎样用iBATIS、JDO和Hibernate实现动态分页查询(paged query),以及何时可能需要使用Hibernate和JDO的native SQL查询。
此外,你还必须处理数据库并发。企业应用程序会有多个用户和后台任务,即可能有多个数据库事务试图同时访问同一份数据。在第12章里,你将学习怎样处理数据库事务级别的并发访问。我们描述了如何处理iBATIS、JDO和Hibernate应用程序中的数据库并发,以及AOP怎样提供一种从数据库并发失败中恢复过来的简单方法。
第13章扩充了第12章描述的用来处理跨一系列事务的数据库并发的概念。多数Web应用程序都包含编辑用例(edit-style use case),它允许用户编辑数据库中的数据。实现这些用例的代码一般要求一个数据库事务读取数据,另一个事务更新数据。在第13章里,你将学习怎样处理编辑用例里的数据库并发。我们描述了各种选择,并详细讨论各自的优缺点。
本书目标读者
如果你是位开发人员或架构师,而且已经掌握企业Java开发基础,并且愿意学习如何有效地使用POJO和轻
无封面