我应该为业务层使用EJB3还是Spring?

我的团队正在开发一个带有Web前端的新的面向服务的产品。 在讨论我们将运用JBoss应用程序服务器以及Flex前端(使用Adobe AIR进行可能的桌面部署)以及用于连接客户端和服务器的Web服务时,我们将使用哪些技术。

当谈到用于我们的业务逻辑的服务器技术时,我们已经陷入僵局。 EJB3和Spring之间的争论很大,我们最大的担心是可扩展性和性能,以及代码库的可维护性。

这是我的问题:

  1. 什么是针对或反对EJB3与Spring的争论?
    • 我可以期待什么陷阱?
    • 我在哪里可以find很好的基准信息?

基于性能的EJB3和Spring之间没有太大的区别。 我们select了Spring的原因如下(在问题中没有提到):

  • Spring以更容易支持unit testing的方向推动架构。 例如,注入一个模拟的DAO对象来testing你的业务层,或者利用Spring的MockHttpRequest对象来testing一个servlet。 我们为unit testing维护一个单独的Springconfiguration,允许我们将testing隔离到特定的层。
  • 一个重要的驱动程序是兼容性。 如果您需要支持多个App Server(或者最终希望从JBoss移动到Glassfish等),您将基本上随身携带您的容器(Spring),而不是依赖不同实现之间的兼容性EJB3规范。
  • Spring允许为持久性,对象远程等技术select。例如,我们也使用Flex前端,并使用Hessian协议在Flex和Spring之间进行通信。

显然,EJB3和Spring之间的差距要小得多。 也就是说,现在EJB3的一个缺点是只能注入到一个bean中,所以你最终可以把组件转换成不需要的bean。

关于unit testing的争论现在是相当不相关的 – EJB3显然被devise为更容易unit testing。

上面的兼容性参数也是不相关的:不pipe你使用EJB3还是Spring,你仍然依赖于事务pipe理器,JMS等的第三方提供的实现。

然而,什么摆动我,是社会的支持。 去年在一个EJB3项目上工作的时候,并没有很多人在使用它,并且谈论他们的问题。 spring,无论是正确的还是错误的,在企业中都是非常普遍的,特别是,这使得更容易find一个你正在试图解决的问题。

什么是针对或反对EJB3与Spring的争论? spring一直在创新,认识到现实世界的制约因素。 Spring为Java 1.4应用服务器提供了简单和优雅,并且不需要2004 – 2006年没有人能够访问的J2EE规范的版本。在这一点上,这几乎是一个宗教性的争论,你可以把它吸进去 – Spring +抽象+开源与Java企业版(Java EE)5.0规范。

我认为Spring的补充不仅仅是 Java EE规范的竞争 。 由于Spring特有的function不断被引入规范,许多人会认为EJB 3为大多数内部业务应用程序提供了“足够好”的function。

我可以期待什么陷阱? 如果你把它当作持久性问题(Spring + JPA)与EJB3对待,你真的不会做出这么大的select。

我在哪里可以find很好的基准信息? 我有一段时间没有遵循specj的基准testing结果 ,但是它们很受欢迎。 看起来,每个供应商(IBM,JBOSS,Oracle和Sun)都对合规服务器的兴趣越来越低。 从1.3,1.4开始,列表会变得越来越短。 1.5 Java企业版。 我认为一个完全符合所有规范的巨型服务器的日子已经结束了。

我肯定会推荐EJB3。 我们发现它更精简,编码更好,支持更好。 我过去曾经使用过Spring,发现它很混乱,而且不像EJB3(或者我猜在一天结束的时候是JPA)

  1. 从EJB3开始,不再需要处理外部configuration文件,并且每个数据库表只有一个POJO注释。 这个POJO可以传递到您的Web层,没有任何问题。 像Netbeans的IDE甚至可以为你自动生成这些POJO。 现在我们已经使用EJB3作为不less大型应用程序的后端,并没有注意到任何性能问题。 您的会话Bean可以很容易地暴露为Web服务,您可以将其暴露给您的Flex前端。 会话bean很容易在方法或类级别locking,以便在需要时分配angular色和类似的东西。

我不能说那么多关于spring,因为我只试了几个星期。 但是我对它的总体印象很差。 这并不意味着它是坏的框架,但我们的团队已经发现EJB3是持久性/业务层的最佳select。

我倾向于比Spring更喜欢Spring,但是我的build议是采取任何方法,试着坚持编写POJO,并尽可能使用标准注释,比如@PostConstruct,@PreDestroy和@Resource这样的JSR注释,它们与EJB3或spring,所以你可以select你喜欢的任何框架。

例如,你可以决定使用Guice代替IoC。

如果你想使用Web应用程序中的预先请求注入,你可能会发现Guice比Spring更容易进行dependency injection。

会话bean主要归结为dependency injection和事务; 所以EJB3和Spring有点类似。 Spring的优势在于更好的dependency injection和更好的JMS抽象

过去我曾经使用过非常类似的架构。 当与Flex Data Services结合使用时,Spring + Java 1.5 + Actionscript 2/3使代码变得非常简单(而且非常有趣)。 但是,Flex前端意味着您需要足够强大的客户机。

关于你的问题:

什么是针对或反对EJB3与Spring的争论?

我build议阅读专家的回应:答复: 由Mark Fisher编写的EJB 3和SPRING比较分析 。 阅读评论以查找Reza Rahman的评论(EJB 3.0)。

另一个有利于Spring的东西是,大多数其他的工具/框架对弹簧的集成有更好的支持,其中大多数也使用内部弹簧(例如activemq,camel,CXF等)。

它也比较成熟,比EJB3有更多的资源(书籍,文章,最佳实践等)和经验丰富的开发人员。

我认为EJB是一个好的组件技术,但不是一个好的框架.Spring是目前为止最好的框架。所以我认为Spring是框架意义上的JEE的最佳实现,我的build议是在每一个项目,使我们可以轻松地与任何组件技术集成。