简化企业级软件开发的关键是提供一个隐藏了复杂性(例如事务、安全性和永续性)的应用框架。良好设计的框架组件可以提升代码的重复使用(reuse)能力,提高开发效率,从而得到更好的软件质量。但是,目前J2EE 1.4中的EJB 2.1框架组件被人们普遍认为是设计较差的和过于复杂的。Java开发者对EJB 2.1很不满,他们已经试验了多种其它的用于中间件服务传送的方法。最引人注目的,下面两个框架组件已经引起开发者的巨大兴趣和积极的反映。它们很可能成为未来企业级Java应用程序可供选择的框架组件。
◆Spring框架组件是一个流行的,但是非标准的开放源代码框架组件。它主要是由Interface21 Inc.公司开发和控制的。Spring框架组件的架构是基于依赖注入(DI)设计模式的。Spring可以单独地或者与现有的应用程序服务器一起工作,它大量地使用XML配置文件。
◆EJB 3.0框架组件是一个标准的框架组件,由Java社区组织(JCP)定义,并受到所有主流的J2EE厂商支持。预发布的EJB 3.0规范的开放源代码和商业实现都可以在JBoss和Oracle上看到了。EJB 3.0大量使用Java注释(annotation)。
这两个框架组件的核心设计理念是相同的:两者的目标都是把中间件服务传递给松散耦合的简单旧式Java对象(POJO)。这些框架组件通过在运行时截取执行内容或向POJO注入服务对象,把应用程序服务与POJO捆绑在一起。POJO本身不关心捆绑的过程,并且对框架组件几乎没有依赖。其结果是,开发者可以聚焦于业务逻辑,个人可以在没有框架组件的情况下测试他们的POJO。此外,由于POJO不需要从框架组件中继承或实现框架组件接口,开发者建立继承结构和构建应用程序的时候都有高度的灵活性。
但是,尽管两者的设计理念是相同的,它们传递POJO服务时却采用了完全不同的方法。尽管目前已经出版了大量的图书和文章来把Spring或EJB 3.0与EJB 2.1进行对比,但是它们都没有对Spring与EJB 3.0之间的差异进行认真的研究。在本文中,我将研究Spring和EJB 3.0框架组件之间的关键差异,并讨论它们的优缺点。本文的主题也可以应用在其它一些名气稍小的企业级中间件框架组件上,因为它们都聚焦于"松散耦合的POJO"设计。我希望本文能够帮助你选择符合需求的最佳的框架组件。
厂商无关性(Independence)
开发者选择某种Java平台的一个最重要的理由就是该平台的厂商无关性。EJB 3.0是一个开放的、标准的、具有厂商无关性的平台。EJB 3.0规范是由企业级Java团体中所有主流开放源代码和商业厂商开发和支持的。EJB 3.0框架组件把开发人员与应用程序服务器实现(implementation)隔离开来了。例如,尽管JBoss的EJB 3.0实现是基于Hibernate的,而Oracle的EJB 3.0实现是基于TopLink的,但是开发人员并不需要学习Hibernate或TopLink的特殊API,就可以让他们的应用程序在JBoss和Oracle上运行。厂商无关性把EJB 3.0框架组件与其它的POJO中间件框架组件区分开来了。
但是,很多EJB 3.0的批评家迅速指出,在写这篇文章的时候,EJB 3.0规范还没有达到最终发表的版本。在EJB 3.0被所有主流的J2EE厂商采用之前可能还需要一到两年时间。但是,即使你的应用程序服务器还没有自然地(natively)支持EJB 3.0,你还是可以通过下载和安装一个"嵌入式的" EJB 3.0产品,在服务器上运行EJB 3.0应用程序。例如,JBoss嵌入式EJB 3.0产品是开放源代码的,可以在任何与J2SE-5.0兼容的环境中(例如,在Java应用程序服务器中)运行。它现在正在进行beta测试。其它的厂商也可能很快发布他们的嵌入式EJB 3.0产品,特别是用于规范的"数据永续性"部分的产品。
另一方面,Spring一直是非标准的技术,而且在可以预见的未来它仍然是这样的。尽管你可以把Spring框架组件与任何应用程序服务器一起使用,但是Spring应用程序都被"锁定"在Spring自身和你所选择的集成到Spring中的特定服务中了。
◆尽管Spring框架组件是一个开放源代码项目,但是它仍然拥有配置文件的专利XML格式和专利编程接口。当然,这类"锁定"发生在任何非标准的产品上,Spring也不例外。但是它却造成了:你的Spring应用程序的长期生存能力依赖于Spring项目本身(或Interface21 Inc公司,它雇佣了大多数Spring核心开放人员)。此外,如果你使用任何Spring特定的服务,例如Spring事务管理器或Spring MVC,你就被"锁定"在这些API中了。
◆Spring应用程序需要知道后台的服务提供者。例如,对于数据持续(data persistence)服务来说,Spring框架组件为JDBC、Hibernate、iBatis和JDO使用了不同的DAO和模板辅助类。因此,如果你希望为Spring应用程序更换持续服务提供者(例如从JDBC切换到Hibernate),你就必须重构自己的应用程序代码,使用新的辅助类。
服务集成
从较高的层次看,Spring框架组件位于应用程序服务器和服务类库之上。其服务集成代码(例如数据访问模板和辅助类)位于框架组件之中,并暴露给应用程序开发者。与此不同的是,EJB 3.0框架组件被紧密地集成到应用程序服务器中,服务集成代码被封装在标准的接口中。
其结果是,EJB 3.0厂商可以积极地优化总体性能和开发者体验。例如,在JBoss的 EJB 3.0实现中,使用EntityManager保持实体Bean POJO的时候,下层Hibernate对话事务会自动地与该调用方法的JTA事务联系在一起,当JTA事务提交的时候,它也会提交。如果使用简单的@PersistenceContext注释(本文后面有一个例子),你甚至于可以在有状态的(stateful)对话bean中把EntityManager和它的下层Hibernate事务捆绑到一个应用程序事务上。该应用程序事务在一个对话中跨越了多个线程,它在事务性的Web应用程序(例如多页面购物车)中是非常有效的。由于在JBoss中,EJB 3.0框架组件、Hibernate和Tomcat紧密集成,上述的简单和集成的编程接口才得以实现。Oracle的EJB 3.0框架组件和其下层Toplink持续服务之间的也实现了类似层次的集成。
EJB 3.0中集成服务的另一个例子是群集(clustering)支持。如果你在服务器群集中部署EJB 3.0应用程序,那么所有的失效接续(fail-over)、负载均衡、分布式缓存和状态复制服务都是可以自动地供应用程序使用的。下层群集服务都隐藏在EJB 3.0编程接口后面,它们对于EJB 3.0开发人员来说是完全透明的。
在Spring中,优化框架组件与服务之间的交互操作要困难得多。例如,为了使用Spring的宣告式事务服务来管理Hibernate事务,你必须在XML配置文件中显式地配置Spring TransactionManager和Hibernate SessionFactory对象。Spring应用程序开发者必须显式地管理跨多个HTTP请求的事务。此外,要在Spring应用程序中使用群集服务也没有简单的途径。
服务集成的灵活性
由于Spring中的服务集成代码是作为编程接口的一部分暴露的,应用程序开发者可以根据需要灵活地集成服务。这个特性允许你集成自己的"轻量级"应用程序服务器。Spring最普遍的使用方式是把Tomcat和Hibernate"粘合"在一起来提供简单的数据库驱动web应用程序。在这种情况下,Spring自身提供事务服务,Hibernate提供持续(persistence)服务--这种组织方式在Spring中建立了一个微型应用程序服务器。
EJB 3.0应用程序服务器没有赋予你挑选服务的灵活性。在大多数情况中,你得到一组事先包装好的特性,而你只需要其中的一部分。但是,如果应用程序服务器由模式化的内部设计主导(类似JBoss),那么你就可能把它分开,去掉一些不必要的特性。在任何情况下,定制成熟的应用程序服务器都不是一个简单的事情。
当然,如果应用程序的范围超越了单节点,那么你可能需要捆绑来自普通应用程序服务器的服务(例如资源缓冲池、消息队列和群集)。在总体的资源消耗方面,Spring解决方案与任何EJB 3.0解决方案一样,都是"重量级"的。
在Spring中,灵活的服务集成使得我们更容易把仿制(mock)对象(而不是实际的服务对象)捆绑到应用程序,用于在容器外部进行单元测试。在EJB 3.0应用程序中,大多数组件都是简单的POJO,我们可以很容易地在容器外部测试这些它们。但是对于测试那些涉及到容器服务的对象(例如持续EntityManager),我们推荐在容器内测试,因为比起仿制对象的方法,它们更简单、更牢固、更精确。 XML与注释的比较
从应用程序开发者的角度来看,Spring的编程接口主要是基于XML配置文件的,而EJB 3.0广泛使用了Java注释。XML文件可以表达复杂的关系,但是它们同时也很冗长、牢固程度也较低。注释简单明了,但是在注释中我们却很难表达复杂的或层次的结构。
Spring和EJB 3.0关于XML或注释的选择是依赖于这两个框架组件后面的架构的:由于注释只能保存相当少的配置信息,只有预先集成的框架组件(类似在框架组件中已经完成了大多数预备工作)可以广泛地把注释作为配置选项。我们已经讨论过了,EJB 3.0符合这种需求,而Spring作为一个通用的DI框架组件,不符合这个需求。
当然,EJB 3.0和Spring都在学习对方的最佳特性,它们都在某个程度上支持XML和注释。例如,在EJB 3.0中XML配置文件是一个可选的重载机制,可以用于改变注释的默认行为。注释也可以用于配置某些Spring服务。
分享到:
相关推荐
【EJB3.0与Spring的对比】 虽然Spring和Hibernate等框架提供了与EJB类似的服务,例如事务管理和持久化,但在分布式场景下,EJB具有天然优势。Spring更适合轻量级应用,而EJB则针对大型企业级分布式应用。EJB3.0在...
### Spring与EJB3.0的关键区别及其优劣分析 #### 一、Spring框架概述 **1.1 引言** Spring作为一个广受欢迎的开源框架,最初被设计用于减轻企业级应用开发中的复杂性问题。它的一个显著特点在于模块化的分层架构...
### EJB3.0与Spring框架的比较分析 #### 一、供应商独立性(Vendor Independence) EJB3.0在供应商独立性方面取得了显著的进步,它支持跨平台部署,这使得开发人员能够在不同的环境中轻松地迁移应用程序。由于EJB...
10. **与其它技术的整合**:EJB3.0可以很好地与Servlet、JSP、JSTL、Spring框架、Hibernate ORM等Java EE技术结合使用,构建完整的应用系统。 "达内EJB3.0精典"这套资料可能包含了上述各个方面的教程和示例,旨在...
根据提供的文件信息,我们可以推断出这是一本关于EJB 3.0的书籍,书名为《Manning EJB3.0 in action》。虽然标题和描述中的故事似乎与EJB 3.0无关,但从部分内容来看,这本书显然是专注于EJB 3.0的技术细节及其在...
该标题与描述指出了一篇关于POJO(Plain Old Java Object)应用框架的文章,主要对比了Spring框架与EJB 3.0(Enterprise JavaBeans 3.0)。文章旨在深入探讨这两种框架在企业级Java应用程序开发中的应用,以及它们...
#### 七、EJB3.0与其他技术的整合 常见的技术组合包括: - **Struts/MyFaces + EJB (JDBC):** 适用于需要分布式技术的大型项目,尤其是对于大并发访问量和高性能要求的场景。 - **Struts/MyFaces + Spring + ...
EJB 3.0简化了EJB规范,引入了POJO(Plain Old Java Object)和注解,使得开发者可以更加便捷地创建和管理业务逻辑组件。EJB容器负责组件的生命周期管理、事务、安全性、并发控制等,为应用提供了一种声明式的服务。...
### EJB与Spring详细对比分析 #### 一、引言 在现代企业级应用开发领域,EJB(Enterprise JavaBeans)与Spring框架均扮演着重要角色。随着技术的发展与需求的变化,两者之间的对比成为了业界广泛关注的话题。本文...
通过ejb.pdf文档,读者可以详细了解到EJB 3.0的各种特性和使用方法,包括但不限于Bean的创建、部署、事务管理、查询机制以及如何与其他Java技术(如Spring、Hibernate)集成等内容。这份资料对于希望掌握EJB 3.0的...
Struts2、Spring和EJB3是Java Web开发中的三个重要框架,它们分别在MVC模式、依赖注入和企业级服务方面发挥着关键作用。这个压缩包提供的源代码是一个完整的项目示例,展示了如何将这三个框架集成到一个应用程序中。...
与早期版本相比,EJB 3.0引入了许多改进,如注解支持、POJO(Plain Old Java Object)风格的组件模型等。 - **新特性**:EJB 3.0中的新特性包括但不限于:无接口视图、容器管理实体、轻量级容器、本地会话Bean等。 -...
本学习笔记将聚焦于Java EE的核心技术和组件,包括Struts、JSTL、Spring以及EJB 3.0,这些都是在实际开发中广泛使用的框架和工具。 首先,Struts是Apache软件基金会的一个开源项目,主要作为MVC(Model-View-...
6. **消息支持(Message Driven POJOs, MDPOJOs)**:Spring 3.0增加了对消息驱动POJO的支持,使得不依赖于EJB的JMS消息处理成为可能。 7. **Web MVC增强**:Spring Web MVC框架在3.0版本中进行了很多改进,包括更...
EJB 3.0是Java企业级开发的一个重要里程碑,它引入了许多新的特性和简化,特别是在与POJO的集成方面。EJB 3.0通过提供无接口视图、注解支持和简化配置等方式极大地提高了开发效率。 **关键特性**: - **无接口视图*...
EJB3.0 通过引入 POJO 支持、简化 API 和增强性能等方面的重大改进,成为构建企业级应用程序的强大工具。对于需要高性能、可伸缩性和易于维护的应用程序而言,EJB 仍然是一个值得考虑的选择。然而,在选择技术栈时,...