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

我的团队正在开发一个具有 Web 前端的面向服务的新产品。在讨论我们将使用什么技术时,我们决定运行 JBoss 应用服务器、 Flex 前端(可能使用 Adobe AIR 部署桌面)和 Web 服务来接口客户端和服务器。

当涉及到将哪种服务器技术用于我们的业务逻辑时,我们已经陷入了僵局。最大的争议在于 EJB3和 Spring 之间,我们最关心的是可伸缩性和性能,以及代码库的可维护性。

以下是我的问题:

  1. 支持或反对 EJB3与 Spring 的论点是什么?
    • 我可以期待每个陷阱是什么?
    • 我在哪里可以找到好的基准信息?
35941 次浏览

我一定会在春季推荐 EJB3。我们发现它更加流线型,更好地编写代码,并且得到了更好的支持。我过去使用过 Spring,发现它非常令人困惑,而且没有像 EJB3(或 JPA,我猜在一天结束时)那样有很好的文档说明

  1. 从 EJB3开始,您不再需要处理外部配置文件,并且每个数据库表只需要注释一个 POJO。这个 POJO 可以毫无问题地传递到您的 Web 层。像 Netbeans 这样的 IDE 甚至可以为您自动生成这些 POJO。我们现在已经使用 EJB3作为相当多大规模应用程序的后端,并且没有注意到任何性能问题。 您的 Session Bean 可以很容易地公开为 Web 服务,您可以将其公开到 Flex 前端。 如果需要,可以很容易地在方法或类级别锁定会话 bean,以分配角色之类的东西。

关于春天我不能说太多,因为我只试了几个星期。但是我对它的整体印象非常差。这并不意味着它是一个糟糕的框架,但是我们的团队已经发现 EJB3是持久性/业务层的最佳选择。

支持或反对 EJB3与 Spring 的论点是什么? Spring 总是在创新,并且能够识别现实世界的约束。Spring 为 Java 1.4应用服务器提供了简单和优雅的特性,并且不需要在2004-2006年没有人能够访问的 J2EE 规范版本。在这一点上,它几乎是一个宗教性的辩论,你可以被卷入-Spring + 抽象 + 开放源码与 Java 企业版(Java EE)5.0规范。

我认为 Spring补充多于竞争具有 JavaEE 规范。随着曾经是 Spring 独有的特性继续被纳入规范,许多人会认为 EJB 3为大多数内部业务应用程序提供了一个“足够好”的特性集。

我可以期待每个陷阱是什么? 如果您将这个问题作为持久性问题(Spring + JPA)与 EJB3进行比较,那么您真的没有做出那么大的选择。

我在哪里可以找到好的基准信息? 我已经有一段时间没有关注 Specj 基准测试结果了,但它们还是流行了一段时间。似乎每个供应商(IBM、 JBOSS、 Oracle 和 Sun)对拥有一个兼容的服务器越来越不感兴趣。从1.3到1.4,认证供应商的名单越来越短。1.5 Java 企业版。我认为完全符合所有规范的大型服务器的时代已经结束了。

我以前也用过类似的建筑。Spring + Java 1.5 + Actionscript 2/3与 Flex Data Services 相结合使得这一切变得非常简单(而且有趣!)编码。 但是,Flex 前端意味着您需要足够强大的客户端机器。

基于性能,EJB3和 Spring 之间不会有太大的区别。我们选择 Spring 的原因如下(问题中没有提到) :

  • Spring 使得体系结构朝着更容易支持单元测试的方向发展。例如,注入一个模拟 DAO 对象来对业务层进行单元测试,或者利用 Spring 的 MockHttpRequest 对象来对 servlet 进行单元测试。我们为单元测试维护一个单独的 Spring 配置,它允许我们将测试隔离到特定的层。
  • 重写驱动程序是兼容性。如果您需要支持多个 App Server (或者最终希望选择从 JBoss 转移到 Glassfish 等) ,那么您实际上将携带您的容器(Spring) ,而不是依赖于 EJB3规范的不同实现之间的兼容性。
  • Spring 支持持久化、对象远程处理等技术选择。例如,我们也使用 Flex 前端,并使用 Hessian 协议在 Flex 和 Spring 之间进行通信。

我倾向于使用 Spring 而不是 EJB3,但是我的建议是,无论你采用哪种方法,尽量坚持编写 POJO,并尽可能使用标准注释,比如 JSR 注释,如@PostConstruction,@PreDestroy 和@Resource,它们可以同时使用 EJB3或 Spring,所以你可以选择你喜欢的任何框架。

例如,你可以决定在某个项目中使用 Guice 代替 IoC。

如果你想使用预请求注入,比如在 web 应用中,你可能会发现 Guice 的依赖注入比 Spring 快得多。

Session bean 主要归结为依赖注入和事务,所以 EJB3和 Spring 在这方面有点类似。Spring 的优势在于更好的依赖注入和更好的抽象,比如 JMS

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

关于单元测试的争论现在已经相当无关紧要了—— EJB3显然被设计成更容易进行单元测试。

上面的兼容性论点也是无关紧要的: 无论您使用 EJB3还是 Spring,您仍然依赖于第三方提供的事务管理器、 JMS 等的实现。

然而,对我来说,最重要的是社区的支持。去年在一个 EJB3项目中,没有多少人使用它并讨论他们的问题。不管正确与否,Spring 在企业中非常普遍,非常特殊,这使得找到与您想要解决的问题相同的人变得更加容易。

另一个有利于 spring 的因素是,大多数其他工具/框架对于与 spring 的集成有更好的支持,大多数工具/框架也在内部使用 spring (例如 activemq、 cam、 CXF 等)。

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

我认为 EJB 是一种很好的组件技术,但不是一个很好的框架。Spring 是目前最好的框架。所以我认为 Spring 是 JEE 框架意义上的最佳实现,我的建议是在每个项目中使用 Spring,这使我们能够灵活地轻松集成任何组件技术。

关于你的问题:

支持或反对 EJB3与 Spring 的论点是什么?

我建议阅读专家的回复: 回应: EJB 3和弹簧比较分析作者: Mark Fisher。阅读评论可以找到 Reza Rahman 的评论(EJB 3.0)。