Spring 与 EJB。 Spring可以替代EJB吗? [关闭]

Posted

技术标签:

【中文标题】Spring 与 EJB。 Spring可以替代EJB吗? [关闭]【英文标题】:Spring vs EJB. Can Spring replace EJB? [closed] 【发布时间】:2010-12-19 05:56:10 【问题描述】:

因为Spring 能够像EJB 一样使用事务。对我来说,Spring 能够取代使用 EJB 的需求。谁能告诉我使用 EJB 的额外优势是什么?

【问题讨论】:

【参考方案1】:

Spring 从一开始就是作为 EJB 的替代品而开发的,所以答案当然是您可以使用 Spring 来代替 EJB。

如果使用 EJB 有“优势”,我会说这取决于您团队的技能。如果您没有 Spring 专业知识,并且有大量 EJB 经验,那么坚持使用 EJB 3.0 可能是一个不错的举措。

为支持 EJB 标准而编写的应用服务器理论上可以从一个兼容的 Java EE 应用服务器移植到另一个。但这意味着远离将您锁定在一个供应商的任何和所有供应商特定的扩展。

应用服务器(例如,WebLogic、Tomcat、JBOSS 等)之间的 Spring 端口很容易实现,因为它不依赖于它们。

但是,您被锁定在 Spring 中。

Spring 鼓励良好的 OO 设计实践(例如,接口、层、关注点分离),即使您决定切换到 Guice 或其他 DI 框架,这些实践也会使他们触及的任何问题受益。

更新:这个问题和答案是 2014 年的五年。需要说的是,编程和应用程序开发的世界在那段时间发生了很大的变化。

它不再只是 Java 或 C#、Spring 或 EJB 之间的选择。使用vert.x 可以完全避开Java EE。你可以编写高度可扩展的, 没有应用服务器的多语言应用程序。

更新:现在是 2016 年 3 月。 Spring Boot 提供了一种更好的方式来编写没有 Java EE 应用服务器的应用程序。您可以创建一个可执行的 JAR 并在 JVM 上运行它。

我想知道 Oracle 是否会继续支持 Java EE 规范。 Web 服务已经取代了 EJB。 EJB 解决方案已死。 (只是我的看法。)

【讨论】:

在我看来,“锁定”这个词太强了,无法描述 Spring。毕竟,Spring 旨在将所有内容粘合在一起,而不是替换它们,您始终可以选择要集成的内容。此外,一切都有锁定,即使是最简单的 Apache Commons 也会锁定我们,但我们仍然每天都在使用它。 没有其他供应商可以替代 VMWare/Spring,您可以在 Oracle、Red Hat 和 IBM for Java EE 平台之间进行选择。这就是我的意思。这不是对 Spring 的能力或有用性的评论。我碰巧非常喜欢它。我每天都用它,晚上睡觉。 @ChristopherYang 是正确的。我的意思是,“Java”将是供应商锁定。所以最终,我们只需要停止争论并完成一些事情。 :-) 这个问题已经快五年了。就个人而言,我认为 EJB 是过时的技术,在各个方面都输给了 HTTP Web 服务。简单而开放的胜利。给我 REST 服务,你就可以保留你的 EJB。 Spring 很好地支持它们。这就是世界已经消失的地方。 感谢您的回复。只是寻找从现有 EJB 2.1 应用程序迁移评估更好的(SPRING,EJB 3.x)的好处。还有一个问题,EJB 3.x 也支持 WebService。那么,我们能否从 JNDI/RMI 用于 Java 应用程序分发和 WS 用于其他应用程序?【参考方案2】:

首先,让我说清楚,我不是说你不应该使用 Spring,而是因为你要求一些优势,这里至少有两个:

EJB 3 是一个标准,而 Spring 不是(它是一个事实上的标准,但那不是一回事),在可预见的未来这不会改变。尽管您可以将 Spring 框架与任何应用程序服务器一起使用,但 Spring 应用程序被锁定在 Spring 本身和您选择在 Spring 中集成的特定服务中。

Spring 框架位于应用程序服务器和服务库之上。服务集成代码(例如数据访问模板)驻留在框架中并暴露给应用程序开发人员。相比之下,EJB 3 框架集成到应用服务器中,服务集成代码封装在接口后面。因此,EJB 3 供应商可以通过在应用服务器级别工作来优化性能和开发人员体验。例如,他们可以将 JPA 引擎与 JTA 事务管理紧密结合。另一个例子是对 EJB 3 开发人员透明的集群支持。

尽管 EJB 3 并不完美,它仍然缺少一些功能(例如注入非托管组件,如简单的 POJO)。

【讨论】:

教育答案,但我想知道为什么/何时需要注入一个简单的 POJO 而不是初始化一个新的? 用于测试目的。【参考方案3】:

帕斯卡的观点是有效的。但是,以下是支持 Spring 的。

EJB 规范实际上有点松散,因此可以在不同的应用服务器上观察到不同的行为。当然,在大多数情况下,情况并非如此,但是对于某些“暗角”,我遇到了这样的问题。

Spring 有很多额外的好东西,比如 spring-test、AOP、MVC、JSF 集成等。EJB 有一些(例如拦截器),但在我看来,它们并没有那么发达.

总之,这主要取决于您的具体情况。

【讨论】:

也许像 Spring 只需要一个 servlet 引擎 会更准确(EJB 可以在任何 JEE 容器中使用,servlet 引擎!= JEE 容器)。 嗯,从技术上讲,Spring 也不需要 servlet 引擎。例如 spring-test 使用内存中的上下文。 嗯,从技术上讲,如果您采用这种方式,EJB 也不需要独立容器。从 EJB 3.1 开始,有标准的EJBContainer.createEJBContainer() API 可以使用嵌入式容器。所以,仍然,你的说法是错误的。 好的,3.1 很新,显然我忘记了添加内容。从我的回答中删除了这一点。【参考方案4】:

Spring 旨在补充 EJB,而不是取代它。 Spring 是 EJB 之上的一层。众所周知,EJB 的编码是使用 API 完成的,这意味着我们必须使用 Spring 框架在 API 中实现所有内容。我们可以创建样板代码,然后拿那个板,添加一些东西,然后一切都完成了。在内部,Spring 与 EJB 相连——没有 EJB,Spring 就不会存在。

使用 Spring 的主要优点是类之间完全没有耦合。

【讨论】:

你完全错了,对不起 对不起@sasi,这甚至不是一个正确或好的答案....... "没有 EJB 就没有 Spring。"伙计,你是真的吗?你有没有在 EJB 的声明中使用过“\@Stateless”,或者使用过 \@EJB 注解进行注入?你认为这些会在 Jetty 或 Tomcat 中工作吗?您认为在 Spring 下如何管理事务?您知道可以将 Spring 应用程序部署到 servlet 容器中吗? 抱歉,但您对 EJB 作为 Java EE 的一部分和 spring 作为约定优于配置的原则这两者都没有很好的理解。实际上,如果您不深入挖掘,您最终可能会认为它们是相同的东西或相关的东西或类似的东西。为什么?它们都有类似注射的相似之处,但它们之间的差异是巨大的。由于 EJB 的复杂性,Spring 确实是作为 EJB 的替代品而诞生的,但事实确实如此。在 Java EE 5 (EJB 3) 的时代已经足够好了

以上是关于Spring 与 EJB。 Spring可以替代EJB吗? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot 简介

将 Spring Security 与 EJB 或 Spring 一起使用?

Spring与EJB的区别!!

Spring Boot → 01:概要

Spring汇总

POJO应用框架:Spring与EJB3.0的比较