Jim Rivera是 BEA 公司的一位技术主管,负责通过技术传播推广BEA 产品的应用。Jim 于1999 年加入BEA,
担任 BEA WebLogic Server 6、7 和8 版本的技术产品经理。在这个岗位上,Jim 负责各种服务器组件的
策略和路线图,包括 EJB、Web services、XML 和集群。Jim 在dev2dev 上有一个blog。dev2dev 通过电子
邮件采访了 Jim,获得他对轻量级Java、应用程序框架和持久性框架,以及它们与应用服务器上企业计算的
关系的看法。
轻量级Java
dev2dev: 您是如何定义“轻量级Java”的?
Jim: 我认为,在Java 应用程序开发环境中,“轻量级Java”主要是指两个东西:简化的编程模型和更具响
应能力的容器。轻量级Java 旨在消除与传统 J2EE API 有关的不必要的复杂性和限制。它也将缩短应用程
序的部署时间,这对于支持开发最佳实践(比如频繁单元测试)非常重要。
dev2dev: 对您来说哪种轻量级技术是最重要的,轻量级Java 对终端用户有什么帮助?
Jim: 很显然,控制反转 (IoC)模式在这个领域有着重大的影响。使用IoC,开发人员不需要编写复杂的代码
来执行查询、处理基础架构异常或管理连接,就能够解决对象依赖性问题。这有助于简化代码、将业务逻辑
与基础架构分离,从而使应用程序更易于维护。
轻量级Java 的另一个关键特征是,它不会强迫业务对象遵循平台特定接口。这允许开发人员在普通旧式
Java 对象(POJO)中实现业务逻辑,从而提高生产率。
与具体的类相反,当把开发的最佳实践与界面相结合时,这些特性也使得对代码进行单元测试容易得多。
由于业务逻辑实现在 POJO中,所以不再需要将对象部署到重量级容器中以在单元测试中练习它。因此,
将对象宿主在诸如 JUnit 之类的简单测试环境中和为快速迭代单元测试“模拟”外部依赖性就变得微不
足道了。
dev2dev: 作为一个技术传播者,您一定目睹了许多新的和已部署的技术。您是否看到了转向轻量级技术
的趋势?
Jim: 当然。在早期的采用者当中,明确地存在转向诸如 Spring、Hibernate 和Beehive 之类框架的趋势。
它在应用程序的构建方式上有了明显的不同,对未来 J2EE技术的方向有着积极的影响。例如,EJB 3.0就
基本上是以使得轻量级Java盛行的概念为基础的。
重量级
dev2dev:人们在想起应用服务器供应商时,通常把它们置于“重量级阵营”。我想您正在努力改变这种
状况,对吧?换言之,许多人认为应用程序供应商已经在实现重量级组件(比如 EJB 2.0)上付出了很
大的代价,它们不愿意轻易放弃这些成果。
Jim: 首先,我认为没有理由放弃在 EJB 上的现有投资,因为在某些场景中它仍然是最好的技术,例如
当您希望通过 RMI远程公开业务服务时。当然,诸如 EJB 之类的开放标准在保护客户投资方面的价值
也不能低估。
已经说过,我觉得人们经常过分强调 EJB在应用服务器中的实际价值。尽管这一点未必对所有的应用服
务器供应商都适用,但是 BEA 只投入了相对较少的一部分开发资源来支持 J2EE API。我们工作最主
要的目标是为宿主应用程序构建最可靠、可伸缩和容错的内核。这些品质以及分布式事务服务、高速
消息传递、遗留系统集成、高级 Web 服务、配置管理、诊断和故障排除和高级安全性,代表了
WebLogic Server 的真正价值,而且对总体拥有成本(TCO)有着巨大的影响。幸运的是,这些附加值
对基于Spring 或Beehive 的应用程序的相关性和适用性与采用EJB 构建的应用程序是一样的。虽然轻量
级Java 技术使得应用程序的开发和维护更容易,但是它们不会代替真正高端应用服务器的品质。实际上,
我们认为轻量级Java 与WebLogic Server 是一致的。
dev2dev: BEA 有没有一个轻量级 Java 策略?BEA 实现轻量级 Java 的方法是什么?
Jim: 我们的策略是接纳所有有利于提高开发人员生产率、在市场上为部署这些技术提供最佳平台的技术。
轻量级 Java有助于降低开发成本,WebLogic Server 则有助于降低运营成本,它们是一个非常强大的组合。
应用程序框架
dev2dev:由BEA赞助的Beehive项目显然是一个轻量级 Java组件模型。您能否谈谈关于 Beehive 的情况,
以及它在你们的整个策略中的地位?
Jim: Beehive是一个应用程序框架,致力于使J2EE 应用程序和基于SOA 的应用程序的开发更容易,它基
于我们发布WebLogic Workshop 的经验。它基于 POJO 和用于配置依赖性、服务质量等的元数据提供一个
编程模型。元数据以 J2SE 5.0 代码注解和外部 XML文件的形式获得支持。存在一些用于访问 J2EE资源、
定义业务和 Web 服务以及基于 MVC模式开发 Web 应用程序的组件。在我们努力提高开发人员生产率、
巩固 Java 整体市场的过程中,Beehive 是非常关键的一部分。
dev2dev: Beehive 可以被认为是一个“应用程序框架”。在Spring Framework中提供了一种非常流行
的轻量级 Java 方法。Spring(以及其他类似的框架)对于 BEA 有多重要?
Jim: 任何能够帮助我们的客户提高生产率的东西都对我们非常重要。我们欢迎并且接纳这些技术,在适
当的时候也可以在技术层面上集成或者共享这些技术。
dev2dev: 你们考虑过明确支持这些框架吗?
Jim: 就像我原来说过的,WebLogic Server具有很多方面的特性,能够提供基于轻量级 Java 技术的应用
程序。许多都是隐含的,然而在某些情况下,最小量的集成工作就能为轻量级 Java 开发人员提供重要
的价值。举个例子,当今存在的一些适配器允许 Spring 应用程序使用 WebLogic Server 的分布式事
务能力,无需改变任何应用程序代码。我们正在调查许多其他的机会,当然也一直在倾听客户的需求。
dev2dev: 我们已经看到轻量级框架对EJB 3 的一些影响。您认为这会扩展到J2EE的其他方面吗?
Jim: 是的。我认为 JSR 175(即Java元数据)对于简化 J2EE 编程模型是一种关键的支持技术。EJB 3.0使
用了它,而且它也是 JSR 181(即Web Services 元数据,一个BEA 倡导的规范)的基础。没有理由相信它
会就此停止。
轻量级持久性
dev2dev: IoC 容器看起来是轻量级 Java 的中心。另外的一个关键因素是POJO 和轻量级持久性。您能针
对这个问题谈谈看法吗?
Jim: 同样,共同的主题是简化编程模型。没有比POJO更简单的了。当然,企业开发要求我们有能力应用附
加的品质,比如持久性规则、事务语义和 POJO 的安全约束。盛行很广的方式是在元数据中定义这些品质,
要么作为代码注解,要么放在外部文件中。
dev2dev: 您是否觉得因为有多种方法用于完成持久性这样的事情而存在一些危险?比如,我们很快将会
有EJB 2、EJB 3、JDO、Hibernate,等等。
Jim: 我认为这只是成熟领域的一个实际情况。多年来,J2EE 规范没有完全涵盖这个特定的领域,自然就
会导致其他规范的出现。就我所知道的在 JCP中发生的事情,我们似乎正在走向统一。这对于整个行业来
说是一件好事。
未来
dev2dev: 您能预见一下轻量级 Java和 BEA 的未来吗?
Jim: 我们将会继续活跃于这个领域中,既通过诸如 Apache Beehive、XMLBeans、Eclipse和JCP 之类的
渠道推动创新,又吸收诸如 Spring 这样的其他领先技术,并且为了客户的利益而展开协作。
艾伯特.爱因斯坦曾经说过:“一切都应该尽可能地简单,但是不能更简单。”确实如此,简化一门理论的
基本假设,使我们可以专注于真正关键的地方,这正是一直以来对科学真理的追求。企业软件开发同样如此。
提供一个将复杂的事物(例如,事务、安全或持久性)对开发者进行隐藏的应用框架是简化企业软件开发的
关键。一个设计良好的框架可以提高代码重用率、开发者的生产力及软件的质量。然而,现有J2EE1.4的
EJB2.1框架被普遍认为设计差,且过于复杂。不满于EJB2.1的框架结构,Java开发者尝试了各种各样的中
间件服务传递方法。最引人注目的是,以下两个框架引起了开发者极大兴趣并得到了大量正面的反馈。他
们以未来企业Java应用所选框架的姿态展现。
Spring框架虽然很流行但并不是一个标准的开源框架。它主要由Interface21 Inc开发和控制。Spring框
架结构是基于依赖注入(Dependency Injection (DI))的设计模式。它可以独立或在现有的应用服务器上
运行,而且大量地使用了xml配置文件
EJB3.0是由Java Community Process (JCP)制订的标准框架,为所有主要的J2EE厂商支持。JBoss已经
提供了试用版EJB3.0标准的开源或商业性质实现。EJB3.0充分利用了Java的注释
这两个框架结构都有一个共同核心设计理念:将中间件服务传递给耦合松散的POJOS (Plain Old Java
Objects, 简单洁净Java对象)。 这样的框架利用截取执行上下文或在运行时将服务对象注入POJO来把
应用服务“缠绕”到POJO。POJO本身并不关心这种“缠绕”,对这种框架结构也没有什么依赖。因此,
开发者可专注于业务逻辑和脱离框架的POJO单元测试。除此之外, 由于POJO并不须要继承框架的类或
实现其接口,开发者能够极其灵活地搭建继承结构和建造应用。
然而,在拥有同一理念的同时,两个框架结构使用不同的方式来传递POJO服务。许多书籍或文章都将
Spring 或EJB3.0和EJB2.1做了比较,但是对Spring 和EJB3.0的比较并没有仔细研究过。在本文中,
我将对Srping和EJB3.0框架背后的关键不同处进行考察,并讨论其优缺点。本文的观点也适用于其它
更少为人知的框架,因为他们都是对“耦合松散的POJO”的设计。希望这篇文章可以帮助你选择适合
你需求的最好框架。
厂商无关性
开发者选择Java平台其中最引人注目的理由之一:厂商无关性。EJB3.0正是一套设计为厂商无关的
开放性标准。EJB3.0标准为所有企业Java社团里开源或商业性质厂商所开发和支持。它将开发者与
应用服务器实现完全隔离。例如,JBoss的 EJB3.0实现基于Hibernate,Oracle的基于TopLink,但
是开发者并不须要学习Hibernate- 或TopLink的具体API来使应用可在Jboss或Oracle上运行。厂商
无关性使EJB3.0与现今其它POJO中间件框架区别开来。
但是,正如许多EJB3.0评论家迅速所指出的,在本文撰写时EJB3.0标准还没有到达一个最终版本。
大概还有一到两年的时间EJB3.0才能广泛地为所有主要J2EE厂商所支持。即使你的应用服务器本身
不支持EJB3.0,你仍然可以通过下载安装”内嵌的”EJB3.0产品来运行EJB3.0的应用。例如,JBoss
的内嵌EjB3.0是开源产品且可以在任何J2SE5.0兼容的环境运行(例如, 在任何Java服务器上),此产品正
处于软件测试阶段。其它厂商不久也将发布自己的内嵌EJB3.0产品,特别是针对标准中关于数据持久性
的部分。
另一方面,Spring一直以来都是非标准的技术,在未来可预知的一段时间内这种情况将持续下去。虽然
你可以在任何应用服务器上使用Spring框架,Spring应用会被锁入在Spring本身和你选择整合进Spring
的具体服务中。
Spring框架是一个开源项目,但同时它有一个XML格式的配置文件和编程接口。当然任何一个非标准的
产品都会有这种“锁入”(lock-in)的情况,并不是Spring特有的。但Spring应用的长期生存能力仍然
还得托Spring这个项目的福(或者是Interface21公司,它雇佣了大部分Spring核心开发人员)。除此之外,
假如你用到任何一个具体的Spring服务,例如,Spring事务管理器或则Spring MVC,你也会被锁入到这些
API里。
Spring的应用对终端用户是不可知的。例如,对数据持久服务,Spring框架兼容不同的DAO和JDBC的模版
帮助类,如Hibernate, iBatis, 和 JDO。所以假如你需要为spring应用切换在数据持久化服务(例如从
JBDC到Hibernate),你需要修改你的代码以适合新的模版帮助类。
服务整合
从一个很高的角度上看,Spring框架处于应用服务器和服务库的上方。服务整合的代码(如,数据访问
模板和帮助类)属于框架,并暴露于应用开发者。相反,EJB3.0框架与应用服务器高度整合,服务整合
代码也包装在一个标准接口后面。
因此,实现EJB3.0的厂商可以大大地优化整体性能和提升开发者的体验。例如,在JBoss EJB3.0的实现
中,当你在用EntityManager持久化一个Entity Bean时,后台的Hibernate会话事务已经自动地帮定到
调用方法的JTA 的事务上,在JTA 事务提交的同时Hibernate会话事务也提交了。你甚至可以使用一个
简单的 @PersistenceContext 注释(稍候例子演示)将EntityManager和它后台的Hibernate事务绑定
到一个stateful session bean的应用事务中。在一个会话中应用事务横跨多个线程,这在事务性网页
应用很有用,例如,多页面的购物车。
由于高度整合的EJB3.0的框架,使简单、集成的编程接口成为可能。Oracle EJB3.0框架和其后台的
Toplink持久化服务也同样程度地整合。
另一个EJB3.0整合服务的绝好例子就是集群支持。假如你在一个服务器集群上部署了一个EJB3.0的应用
,所有容错(fail-over)、负载均衡、分布式缓冲和状态复制都已经自动为应用所获得可用。后台的集
群支持被隐藏在EJB3.0的框架后面,对EJB3.0开发者来说这些都是完全透明不可见的。
在Spring里,很难优化框架和服务之间的通讯。例如,为了使用Spring里的声明事务服务来管理
Hibernate事务,你必须显示地在XML文件中配置Spring TransactionManager和Hibernate
SessionFactory对象。Spring必须电显示地管理横跨多个HTTP请求的事务。除此之外,没有别的
方法均衡Spring应用里的集群。
服务组合的弹性
由于Spring的服务整合代码作为编程接口的一部份暴露在外,应用开发者有按自己需求装配服务的弹性
。这个特点使你能够组合自己的轻量级应用服务器。Spring的一个普遍用法就是将Tomcat和Hibernate
组合在一起支持数据库驱动的web应用。在这种情况,Spring本身提供事务服务,Hibernat提供持久化
服务——这种设置创建了一个袖珍型的应用服务器。
EJB3.0应用服务器典型地不提供这种根据需求任你挑捡服务的弹性空间。大多数时间,你得到的只是
一系列包装好的特性,其中一些你可能根本就不需要。但是如果应用服务器像JBoss一样提供一个模块
性的内部设计,那么你可以只取其中一部分,而把不必要的部分剥去。在任何情况,去自定义一个功能
强大的应用服务器是没有什么价值的。
当然,假如应用已经超过单个点,那么你应该加入常用服务器上的服务,例如,资源池(resource pooling)
,消息队列(message queuing)和集群(clustering)。就总体的资源消耗而言,Spring解决方法和其他EJB3.0解决方法一样是重量级的。
在Spring框架里,具有弹性的服务装配使得将虚拟对象而不是真正的业务对象绑定到应用中做脱离容
器的单元测试更简单。在EJB3.0应用中,大多数组件都是简单POJO,他们可以很容易地在容器外被测试。
但是对于与容器服务相关的对象(例如持久化实实体管理器EntityManager)建议用容器内测试。因为这
样会比虚拟对象测试方法更简单,强壮及准确。
XML Vs.注解
从应用开发者的观点上来看,Spring的编程开发接口主要基于XML配置文件而EJB3.0广泛地应用Java注解。
XML可以表达复杂的关系,但是它也冗长且不够健壮;注解简单明了,但是很难在注解里表达复杂或继承
性的关系。
Spring选择XML或EJB3.0选择注解都是有他们两者框架后的体系结构决定的。因为注解只能容纳很少的配置
信息,只有整合前的框架(重头戏都在框架里)才可以把广泛地使用注解作为配置选择。正如我们所讨论
过的,EJB3.0刚好符合这个要求,而Spring作为一个普通的DI框架并不符合。
当然,EJB3.0和Spring都相互取长补短,在某种程度上他们都支持XML和注解。例如,在EJB3.0中,XML配
置文件作为一个可选的重载机制来改变注解的默认行为。注解也可以配置一些Spring服务。
通过例子是学习XML和注解方式之间差异的最好方法。在下面几个环节里,让我们来看看Spring和EJB3.0
是怎样提供关键服务给应用的。
声明性服务
Spring和EJB3.0都将运行时服务(例如,事务、安全、日志和配置服务)绑定到应用。因为这些服务于
应用的业务逻辑是没有直接联系,他们只是由应用本身管理。换句话说,这些服务在运行时由容器透明
地应用到应用中。开发者或是管理者配置容器,准确地告诉它什么时候怎样应用这些服务。
EJB3.0运用Java注解来配置声明性服务,而Sring使用XML配置文件。在大多数情况下,EJB3.0注解方式
对于这种服务更简单明了。这里有一个在EJB3.0中将事务服务运用到POJO的例子。
public class Foo { @TransactionAttribute(TransactionAttributeType.REQUIRED) public bar ()
{ // do something ... } }
你也可以为一个代码段声明多个属性,应用多个服务。这是一个在EJB3.0里同时应用事务和安全服务到