Java企业应用系统框架的比较与选择
介绍
EJB的架构是J2EE的基础和核心,它定义了整个标准的应用程序开发架构和部署环境。基于EJB的框架一度成为人们开发Java企业应用的首选。随着Java开源项目阵营的发展,一些基于POJO(Plan Old Java Objects)的开源框架越来越广泛的引入到Java企业应用的开发中。按照复杂程度,人们习惯称前者为重量级框架,后者为轻量级框架。Java企业应用框架一般分为三个层次:表示层、业务逻辑组件层和持久层。本文主要对这三个层次所对应的两类流行的企业应用框架进行了详细的比较,最后对Java企业应用的系统框架选择提出了作者的看法。
两类框架概述
1.基于EJB的重量级框架
因为EJB容器可以处理系统性能、事务机制、安全访问权限、分布式计算等问题,所以基于EJB框架的开发可以保证企业应用的顺利开发,而不是达到一定规模就更换一套软件系统,可以保证开发人员将大部分精力集中在业务逻辑的开发上。用EJB框架开发的企业应用具有继承或依赖EJB容器的特点。EJB充分考虑大型项目的需求,几乎可以解决企业应用中涉及的所有问题。相应的基于EJB的框架也是具有复杂功能的重量级框架。
J2EE1.4标准中规定的EJB 2.1框架缺乏设计,并且实现起来有些过于复杂。目前J2EE5.0新规范提出EJB 3.0的目标是简化开发[1],借鉴了一些基于POJO的思想。与EJB2.1相比,有两个重要的变化:一是使用了Java5中的程序注释工具,替代了过多的XML配置文件,取消了严格的组件模型要求;其次,采用了基于Hibernate和TopLink的O/R映射模型。
在J2EE5.0的新规范中,对企业应用的三个层次的标准实现定义如下:表示层采用JSF(Java Server Face),JSF的开发过程核心是事件驱动,组件和标签的封装程度很高。许多典型的应用程序不再需要开发人员来处理http。整个过程通过IoC(依赖注入)[2]来实现;业务组件层采用EJB3.0的会话Bean。EJB3.0允许开发人员使用松散耦合的组件来开发应用程序。这些组件通过它们自己发布的业务接口耦合在一起,因此不需要EJB 2.1规范定义的Bean必须遵循的严格组件模型。每个EJB类必须从某种抽象类继承,并为容器提供一个回调挂钩。持久层采用EJB3.0实体Bean持久模型,吸收了Hibernate的一些思想,采用O/R映射模式。EJBQL也有许多重要的变化。
2.基于POJOs的轻量级框架
在基于POJOs的轻量级框架上开发的应用程序可以独立运行,而不依赖于EJB容器。对应于Java企业应用三个层次的轻量级框架技术已经有了一定程度的发展,这三个层次的流行框架如下:
目前流行的开源表示层框架主要有Struts和Tapestry。Tapestry与Struts应用程序框架的不同之处在于,它是基于组件的,而不是面向脚本语言(比如JSP和Velocity)。组件由一个定义文件(XML格式)、一个HTML模板和一个JAVA类组成。业务组件层面也有很多轻量级的解决方案,包括Spring、Hivemind等等。但是目前应用最广泛的框架是Spring,这是一个基于IoC和AOP(面向方面编程)的框架[3]。使用IoC使得组装bean变得容易,并且提供了简洁的AOP来实现事务管理,但是不具备处理应用分发的能力。Spring的核心点是支持不绑定到特定J2EE服务的可重用业务和数据访问对象。这些对象可以在不同的J2EE环境(Web或EJB)、独立的应用程序和测试环境中重用;持久层盒子主要包括Hibernate,各种JDO产品,以及iBATIS。Hibernate是一个开源的O/R映射框架,它用一个非常轻量级的对象封装了JDBC。它可以应用于任何使用JDBC的场合,可以用EJB代替J2EE框架中的CMP来完成数据持久化的重任。IBAS是一个简单的SQL映射工具,它将xml配置文件中手工编写的SQL语句映射到Java对象中。
对应三个级别的框架比较
1.表示层框架比较
MVC设计模式不再是一个表示层框架的特征,而是这些框架的共性。Struts框架由于出现较早而被广泛使用,其社区非常活跃。很容易找到很多现成的开源函数标签可以使用,有样例程序可以参考。但其组件在页面中显示的粗粒度和框架类的限制在很多情况下会过于死板,会给表示层的开发带来一些额外的代码开销。JSF很大程度上类似于Struts,只是JSF的组件概念没有像Struts那样有继承ActionForm的限制,JSF在事件粒度上比Struts更细腻。JSF的另一个优势是它有太阳公司和其他大公司的支持。Tapestry是一个完整的组件框架,Tapestry的组件可以嵌入和包装其他组件,因此它们可以组合起来形成一个更大的组件或逻辑页面。组件的行为模式为网页编程和事件处理提供了极大的便利。所以,如果你想做一个页面需求灵活性高的系统,可以考虑选择Tapestry。
表1三种框架表示层功能的技术细节比较
框架
struts
tapestry 3.0
JSF
视图组件实现模式
标签库+组件,组件必须继承ActionForm
的完整组件,包括显式调用和隐式调用,组件必须继承BaseComponent
标签库+组件,而普通POJO不需要继承。
视图中组件显示粒度
视图页面只能显示表单对应的ActionForm,配置中Action和ActionForm与页面的关系一般只有1:1:1。
组件可以嵌入到页面的任何一行,并且对使用的组件数量没有限制。
与Tapestry相同
跳转页面
使用标记库html:link中声明的目标URL,URL名称需要对照struts_config.xml配置文件中的路径命名,并与组件动作耦合。
URL名称是目标的组件名称,由于不涉及URL、path等操作,方便且稳定。
与Struts类似,也需要在配置文件中找到,并与组件分离。
触发器
是通过提交表单来激活的,不能细化到表单中的字段。
可以为表单的每个字段分配一个事件,事件组件必须实现PageListener接口
这与Tapestry相同,事件组件必须实现ActionListener。
2.业务组件层框架的比较
EJB 2.1框架过于复杂,有以下缺点:① EJB模型需要建立很多组件接口,实现很多不必要的回滚方法;②EJB部署描述复杂且容易出错;③开发者无法脱离EJB容器测试。JCP (Java Community Process)制定的EJB3.0标准框架也做了相应的改进,得到了所有主要J2EE厂商的支持。EJB3.0和Spring都有一个共同的核心设计概念:向松散耦合的POJOs提供中间件服务。
EJB3.0框架与应用服务器高度集成,服务集成代码包装在标准接口之后。一方面,EJB框架有成熟的EJB容器支持,基于EJB框架的企业应用性能优秀;另一方面,EJB容器设计由于考虑各种功能,在其内核上总是显得臃肿,这也是一种重量的表现。不必要的东西的存在,肯定会影响效率,EJB也不可能根据项目要求,以可配置的方式切割整个EJB,包括EJB集装箱。
Spring框架在应用服务器和服务库之上,服务集成的代码属于框架,向应用开发者公开。它与应用服务器的集成能力弱于EJB3.0。但是,Spring框架模块的可分离配置显示了它相对于EJB3.0的灵活性
表2 EJB框架和Spring框架的具体细节比较
框架
EJB新协议/EJB新协议
Spring框架1.x
0条评论