就其涵盖的范围而言,读者捧在手中的这本书已经算得上短小轻薄了,这是因为本书所讲述的主题并不像你所想象的那么复杂。
J2EE的“正统”使得人们在很多简单的问题上投入了大量的精力。说实话,J2EE行业的情况常常会让人感到:这些人坚信世界上根本就没有简单的问题。
很多——也许是绝大多数——J2EE应用程序都遭遇了过度工程,并因此拥有一个毫无必要的、复杂的体系结构。过度工程会带来巨大的开销,而J2EE开发者们往往一厢情愿地认为:复杂的体系结构能够极大地降低未来的成本,足以抵消前期增加的成本。可惜,这样的因果关系在软件工程领域通常是痴人说梦。预先设计的复杂度越高,就意味着有越多的代码需要编写和维护,意味着系统中潜伏着越多的bug,意味着需要越多的时间才能向用户展示系统的功能。说到底,预先设计的复杂度越高,失败的机会就越大,成本开销也越高。
J2EE的过度工程多半与EJB有关。正如我在Expert One-on-One J2EE Design and Development中曾经说过的,EJB常常被误用。这是一个严重的问题,因为EJB有可能带来巨大的复杂度——甚至比它所掩盖起来的复杂度还要大。而且,EJB提供的一些服务也被过高地估计了。譬如说,大凡有经验的开发者和架构师,只要用实体EJB访问过关系型数据,几乎没有谁愿意重复这个痛苦的经历——至少,如果有JDO、Hibernate和其他的透明持久化技术可供选择的话。
从2002年末开始,对EJB的批评逐渐成了家常便饭。对于一种并不完美的技术,挑毛病总是很容易的,而找出合适的替代品就不那么容易了。大多数J2EE应用程序并不能从EJB那里得到更多的利益,本书便为这些项目的开发者指出了一条更好的新路。本书并不是纯粹的理论探讨,而是对于“如何在有限的时间和预算范围内设计、实现高性能J2EE应用程序”的实践指南。我们推荐的体系结构来自大量的经验,而且有众多开源解决方案能够满足其中常见的基础设施需求,我们还根据这个体系结构创建了一个极具现实意义的示例应用,这些都足以证明它的价值。
尽管EJB已经暴露出很多问题,但它仍然被大量采用,原因无外两种:“流行”和“恐惧”。EJB一度非常流行,就连不懂技术的管理者们也多少听说过它的大名,关于J2EE体系结构的书籍也很少提到EJB的替代品——尽管确实有一些出类拔萃的替代品存在。而且,人们还害怕这些替代品会使情况变得更糟。譬如一种常见的论调说:如果没有EJB容器的帮助,开发者们就得亲手解决诸如事务管理之类复杂的问题。本书将让读者看到:这些恐惧大多是毫无根据的。在每一处潜藏着复杂问题的地方,读者都将看到:EJB的替代品们以更为精彩的方式解决了这些问题。
本书所介绍的架构方案是J2EE体系结构朝着更简单、更理性的方向迈出的第一步,它适于与敏捷方法结合使用。我们的方案采用了面向方面的程序设计(Aspect Oriented Programming,AOP)等新近发展的技术,并且从.NET等与J2EE竞争的平台借鉴了很多有益的思想。
作为本书的作者,我希望能够帮助读者搭建能够满足需求的、尽可能简单的应用程序——自然,也应该是最便宜、最具可维护性和可测试性的应用程序。
令人惊讶地,“EJB之优劣”在J2EE社群中已经成了一个感情问题。在这个问题上,J2EE社群呈现出一种彻底的两极分化:要么是除非被逼无奈、否则决不使用EJB;要么是认为大凡怀疑EJB的人都是懒惰无知的异教徒,几乎没有任何中间派。
读者大概都知道,我不是EJB的支持者,但我也曾经用EJB开发过很多应用程序。我对于EJB的任何观点,都源于丰富的个人经验和对EJB规范的深入了解。在本书中,我也努力澄清自己在这个问题上的立场:我的目标是帮助读者开发出色的应用程序,而不是对抗EJB。读完本书之后,你应该有能力评估EJB在每个应用程序中的价值。如果在充分了解EJB及其替代品之后,你仍然坚信EJB能够最好地满足你的需求,就使用EJB吧。本书不会黑白分明地对读者说“不要使用EJB”,但你必须清楚了解自己的选择。
本书为谁而作
本书的目标读者是对技术有充分把握、希望更加有效地使用技术的J2EE架构师和开发者。本书的内容是企业应用开发中的“why”和“how”,而不仅仅是“what”。所以,在这里你看不到API的列举,也看不到对J2EE基础服务(例如JNDI和JTA)的介绍——有很多书和文章已经介绍了这些主题。
对于web应用的开发者来说,本书中的内容尤其有用。不过,即便不是开发web应用,绝大多数J2EE开发者仍然能够从中找到一些有价值的东西。也许读完本书以后,你会断定EJB正是适合你的选择,即便如此,按照本书所提出的标准,你也能够清楚地知道自己为
什么使用EJB、EJB究竟为你提供了哪些价值。
本书的目标
本书的目标是要帮助读者解决实际问题。我们希望借本书向读者展示一种——与Sun公司的蓝图应用所展示的、基于EJB来管理业务逻辑的传统J2EE方案相比——更为简单有效的J2EE开发之道。
当然,我们也希望能给读者带来更多的快乐。
本书有哪些内容
本书涵盖了下列内容:
□ EJB存在的问题和J2EE架构的常识;
.□ 成功J2EE项目的核心价值;
□ J2EE应用程序(尤其是web应用)的有效架构:
□ J2EE架构及实现的常见错误:
□ 如何针对你的应用找到最简单、最具可维护性的架构:
□ 控制反转(Inversion Of Control,IoC)和面向方面的程序设计(Aspect-Oriented Programming,AOP):两种重要的技术,并且最近在J2EE开发中愈加显得重要。
第6章至第12章介绍了如何用轻量级的、更具可测试性的替代品来取代EJB提供的服务,尤其是:
□ 事务管理。这是企业级应用的基础,也是使用EJB最常见的动机。我们将看到事务管理方面的替代方案,并分别讨论声明性和编程性的事务管理。
□ J2EE应用程序的数据访问。除了事务管理之外,这是企业级应用中的另一个核心问题——而且EJB对这个问题的解决非常糟糕。
□ 如何使用AOP来解决很多企业级软件开发中的常见问题。
我们还将讨论:
□ web层设计,以及web层在一个设计良好的J2EE应用中的地位。
□ 测试和测试驱动的开发方法,以及如何有效地测试J2EE应用。
□ 性能和可伸缩性。
本书中涉及的特定技术包括:
□ 使用JDBC、Hibernate和JDO访问数据。
□ Struts、WebWork、SpringMVC和JSP等web层技术。
□ 使用开源产品开发健壮的应用基础设施,尽量减少需要自主开发、测试和维护的代码量。大多数J2EE基础设施问题都已经有出色的开源产品可以解决,我将帮助读者合理地采用这些开源产品,从而将精力集中在自己的应用独有的问题上。
需要的知识
本书不是EJB或者J2EE的入门读物。
我们希望读者了解J2EE核心API和服务,例如JNDI、JTA、数据库连接池等。
我们希望读者对于J2SE有充分的了解,包括反射、内部类、动态代理、JDBC、JAXP、JNDI等。
我们希望读者对于OO(Object-Oriented,面向对象)设计有充分的理解和经验。
本书讲述的主题是EJB的替代品,因此读者并不需要具备EJB的详细知识,但如果读者熟悉EJB,将对阅读本书大有帮助。如果你希望快速了解EJB,不妨看看Ed Roman的Mastering Enterprise JavaBeans,Second Edition(Wiley,2001)。
读者需要理解EJB背后的中间件基本概念,例如资源池、远程调用、事务管理等。读者还应该清楚采用n层架构(而非客户端-服务器架构)的基本动机。
读者需要理解web界面的基本概念,以及J2EE web应用中所使用的MVC架构模式。
如果你还不熟悉AOP,不必担心,我会在第8章中介绍这个主题,使你能够开始实现具有AOP能力的应用程序。我还将在第8章中提供一份阅读清单,你可以从中获得更多关于AOP的知识。
推荐读物
本书是Expert One-on-One J2EE Design and Development(Wrox,2002)的续篇。当然只读本书也未尝不可,不过我希望读者能够首先阅读它的前作,因为其中详细介绍了很多编程实践方法,这些内容在本书中往往只能一笔带过。该书的第4章、第9章、第11章至第13章与本书的关系尤为紧密,它们是撰写本书的背景。
我还强烈推荐Martin Fowler的Patterns of Enterprise Application Architecture (Addison-Wesley,2002),其中探讨了企业级软件开发中的很多常见问题,并且与具体的实现技术(例如J2EE)保持了足够健康的距离。Martin Fowler是我最欣赏的技术作家之一,他的作品总是值得一读的。单是Fowler的分布式对象第一法则(“不要分布你的对象”),就已经值回书价了。此外,该书还引入了POJO(Plain Old Java Object,普通Java对象)这个术语,在这个“大词”横行的年代,Fowler用这个词让普通Java对象赶上了潮流。在本书中,我也将使用这个术语。
我一直坚信:J2EE应用首先应该是一个OO应用。因此我强烈推荐OO领域的经典著作:Design Patterns:Elements of Reusable Object-Oriented Software(Gamma,Helm,Johnson和Vlissides,Addison-Wesley,1995)。即便对于J2EE应用程序,这本书中列举的23个模式仍然是最有价值的——比那些针对实现技术的“J2EE模式”要有价值得多。
Core J2EE Patterns(Alur,Crupi和Malks,2003)是一部重要的著作,这很大程度上是因为它定义了J2EE模式的标准名称。在本书中,我将引用其中的几个模式,例如ServiceLocator、Business Delegate、Front Controller等,如果已经了解这些模式,对于阅读本书将不无裨益。Core J2EE Patterns更多地展现了传统的J2EE架构思路(不过第二版已经有了相当可观的改进),但无论如何,这是一个非常有用的资源。
我建议你每天关注最新的J2EE话题。我最中意的一些J2EE网站有:
□ TheServerSide。最重要的J2EE门户,如果希望随时了解J2EE的发展,这里是最好的地方。在这里可以找到关于很多J2EE问题的讨论,以及大量有用的资源,例如技术文章、书籍章节预览、产品预览等。
□ Artima.com(www.artima.com)。面向Java/J2EE的软件站点,由Bill Venners管理。
□ Core J2EE Patterns网站(www.corej2eepatterns.com/index.htm)。
□ 各个blog。Java blogger们构成了一个小圈子,彼此探讨着一些非常重要的思想。如果你希望开始探索这个重要的信息渠道,www.javablogs.com会是一个不错的起点,这里著名的blogger包括Rickard Oberg、Ted Neward、Gavin King、Bob Lee(“CrazyBob”)和Jon Tirsen等人。
我建议你每天关注中间件——而不仅仅是J2EE——的最新信息。.NET的整体架构和J2EE非常相似,和J2EE一样,.NET的模式文献也在日益增加。这方面有用的资源包括:
□ MSDN(http://msdn.microsoft.com/)。
□ “微软.NET企业级解决方案模式”网站
(http://msdn.microsoft.com/architecture/patterns/Esp/default.aspx)。要使用本书,需要做些什么
如果要运行本书的示例应用和范例代码,你需要:
□ 一个J2EEweb容器或者应用服务器。对于使用单一数据库、不需要JTA的范例,我们
使用Tomcat 5.0.16;对于用到JTA的范例,我们使用WebLogic 8.1 Express。书中所有的代码可以不加修改地在大多数别的应用服务器上运行(这是不使用EJB一个附带的好处!),所以你可以放心地把这些代码部署到你喜欢的应用服务器上。在示例应用的发布说明中指出了该应用在哪些应用服务器上进行过测试。
□ 一个关系型数据库,以及相应的JDBC驱动。作为示范,我们使用的是HSQLDB(http://hsqldb.sourceforge.net/)。不过,最多需要一些细小的更改,就可以在任何具备事务能力的数据库上执行这些范例。
□ Spring框架,读者可以在http://www.springframework.org下载这个框架,以及使用Spring进行开发时需要的很多资源。本书附带的示例应用是在Spring 1.0最终版本的基础上编写的,不过它应该能够不加修改地在Spring的后续版本上执行。
□ Hibernate 2.1 O/R映射产品,读者可以在http://www.hibernate.org/下载它。
□ JakartaAnt 1.5.3,行业标准的Java构建工具。也许你更喜欢用Maven(一个更复杂也更强大的构建工具)来构建你的项目,即便如此,你也应该清楚Ant的用法。脚本驱动的、可重复的项目构建步骤是非常重要的,具体使用Ant还是Maven倒在其次。
□ 其他的第三方库,包括Jakarta Commons Logging和Jakarta Commons Attributes等。在
完整的Spring发布版本中已经包含了必要的jar文件,更多细节请参阅Spring和示例应用的文档。
所有必需的软件都是开源或者允许开发者免费使用的。