通过对EJB系列的总结和学习我们已经对EJB有了基本的了解,但是为了更进一步的去深入学习EJB,我们很有必要将它拿出来跟之前非常熟悉的spring进行一下对比,通过对比来了解这两个内容的相同与不同之处,更有利于我们对两者进行深入的了解.
我们都有过这样的经历,在开发应用程序的时候,选择哪个技术是比较有学问的.在我最近的面试过程中也有很多问道关于技术选型的问题,举一个比较典型的例子比如:为什么你们的系统要选择EJB3.0而不选用Spring或者为什么选择Spring不选择EJB等.
一般而言我们会针对特定的问题会采用哪种技术能够最有效的解决它?这样的决定并不是很轻易的就能做出来的.我们需要了解各自的优势和劣势.接下来我们将会对Spring和EJB进行一系列的对比.
我们首先需要了解的一个概念是Spring是一个具体的实现,而EJB3.0是J2EE的规范,这是大的概念上的不同.但是在具体的一些地方他们两个又有着许多的共同点.例如,他们都提供把中间件服务传递到 Java 应用。如果看一下历史会更清楚明了一些,Spring 被开发出来就是为了反对 EJB ,当然,那时候的EJB2的确有着自身很多的不足,但是随着新版本的 EJB 发布, EJB3.0 究竟克服了以前版本的一些缺点,并且借鉴了Spring的相关内容.
Spring和EJB他们各自都提供了那些功能?从这个最直接的问题入手能够直观的看到他们各自的特点.Spring定义成分层的J2EE应用框架.EJB则是针对面向对象,分布式的企业级应用开发和部署组件架构.一个是框架,一个是架构.框架更多的是实现,而架构更多的是定义.
关于数据持久化
关于数据持久化这一个关键的部分,Spring和EJB3.0都对其提供了良好的支持。Spring把众多流行的持久化框架集成进来,包括JDBC、hibernate、JDO、iBatis和JPA。EJB3.0的出现将实体bean用JPA取代。JPA致力于提供一个简单的、轻量级的OR映射框架。这个规范定义了两个接口,一个用于在persistence provider间交互,另一个用于在实体和关系数据库之间建立映射。
在EJB3中通过使用@PersistenceContext注释提供的entityManager对象来获得JPA的数据访问,而在Spring中,通过对SessionFactory对象的注入获得Hibernate数据访问。我们很多人会默认为EJB使用JPA来操作数据对象,而Spring使用Hibernate来操作数据对象。但实际上,Spring同样支持使用JPA来操作数据对象,并且Spring可以通过@PersistenceContext注释来支持JPA。
关于轻量级和重量级
轻量级框架和重量级框架解决问题的侧重点是不同的。
Spring为代表的轻量级框架侧重于减小开发的复杂度,相应的它的处理能力便有所减弱(比较适用于开发中小型企业应用。采用轻量框架一方面因为尽可能的采用基于POJOs的方法进行开发,使应用不依赖于任何容器,这可以提高开发调试效率;另一方面轻量级框架多数是开源项目,开源社区提供了良好的设计和许多快速构建工具以及大量现成可供参考的开源代码,这有利于项目的快速开发。
而作为重量级框架EJB强调高可伸缩性,适合与开发大型企业应用。在EJB体系结构中,一切与基础结构服务相关的问题和底层分配问题都由应用程序容器或服务器来处理,且EJB容器通过减少数据库访问次数以及分布式处理等方式提供了专门的系统性能解决方案,能够充分解决系统性能问题。
轻量级框架的产生并非是对重量级框架的否定,甚至在某种程度上可以说二者是互补的。轻量级框架在努力发展以开发具有更强大,功能更完备的企业应用;而新的EJB规范EJB3.0则在努力简化J2EE的使用以使得EJB不仅仅是擅长处理大型企业系统,也利用开发中小型系统,这也是EJB轻量化的一种努力。对于大型企业应用以及将来可能涉及到能力扩展的中小型应用采用结合使用轻量级框架和重量级框架也不失为一种较好的解决方案。
提供商无关性
开发者选择JAVA平台的一个最重要的原因就是它的提供厂商无关性。EJB3.0是一个被设计为对提供商没有依赖性的开放的标准。EJB 3.0规范由企业JAVA社区的主流开源组织和厂商共同编写和支持的。EJB3.0框架使开发者的应用程序实现可以独立于应用服务器。
比如,JBoss的EJB3.0的实现是基于Hibernate的,Oracle的EJB3.0实现是基于TopLink的,但是,在JBoss或者Oracle上跑应用程序,开发者既不需要去学习Hibernate,也不需要学习TopLink提供的独特API。厂商无关性使EJB3.0框架区别于当前其他任何的POJO中间件框架。
很多人认为,尽管在任何应用服务器都上可以使用Spring框架,但基于Spring的应用仍然被限制于Spring本身,以及在应用中使用到的Spring提供的各种特别服务。但事实上是不是如此呢?大家应该知道,Spring的应用程序中,JtaTransactionManager使用了自动检测机制,不管是MBeans应用服务器还是Tomcat应用服务器。同理,当使用JPA时,Spring自动检测persistence.xml文件,并且创建EntityManagerFactory对象。在上面这些机制中,Spring不管是采用注释还是采用XML,都可以像EJB应用一样的与应用服务器提供商无关。
参考文章:Make the Right Decision with Our Side-by-Side Comparison of Springand EJB 3.0