什么是Enterprise Java Bean?

HDa*_*ave 12 java enterprise tomcat javabeans ejb-3.0

在Tomcat FAQ上,它说:"Tomcat不是EJB服务器.Tomcat不是一个完整的J2EE服务器."

但如果我:

  • 使用Spring提供应用程序上下文
  • 用JPA注释注释我的实体(并使用Hibernate作为JPA提供者)
  • 将C3P0配置为连接池数据源
  • 用@Transactional注释我的服务方法(并使用Atomikos作为JTA提供者)
  • 使用JAXB进行编组和解组
  • 并可能添加我自己的JNDI功能

那我不是有效地拥有一个Java EE应用服务器吗?然后不是我的bean EJB?还是有其他一些定义特征?

什么是符合Java EE的应用服务器为您提供的,您不能轻易/轻松地从Tomcat获取某些第三方子系统?

ska*_*man 5

EJB是符合javax.ejbAPI的JavaEE组件.

JavaEE是API的集合,您不需要使用它们.

Tomcat是一个"部分"JavaEE服务器,因为它只实现了一些JavaEE API,例如Servlets和JNDI.它没有实现例如EJB和JMS,因此它不是完整的JavaEE实现.

如果您添加了一些额外的部分(例如OpenEJB,HornetQ),您将添加缺少的部分,并最终得到一个完整的JavaEE服务器.但开箱即用,Tomcat不是那样,并不会尝试成为.


Pas*_*ent 4

但如果我添加 (...) 那么我是否实际上就拥有了一个 Java EE 应用服务器?那么我的 Bean 不是 EJB 吗?或者还有其他一些决定性特征吗?

不,您没有 Java EE 应用程序服务器,成熟的 Java EE 应用程序服务器不仅仅是 Tomcat + Spring + 独立的事务管理器。即使添加 JMS 提供程序和 EJB 容器,您仍然不会拥有 Java EE 服务器。在我看来,所有部分之间的粘合很重要,并且是 Java EE 容器附加值的一部分。

关于 EJB,EJB 规范不仅仅是 JPA,还包括会话 Bean 和消息驱动 Bean(实际上,我并不真正将 JPA 实体视为 EJB,即使由于历史原因 JPA 是 Java EE 5 中 EJB 3.0 规范的一部分) - 在 Java EE 6 中不再如此,JPA 2.0 和 EJB 3.1 是单独的规范)。我还应该提到的是,带有注释的 Spring bean@Transactional并不等同于会话 Bean。Java EE 容器可以使用会话 Bean 执行更多操作(见下文)。虽然您可能不需要它们,但它们仍然不是严格等效的。

最后一件事,Java EE 容器实现了一个标准,而 Spring 容器没有,它是专有的。

兼容 Java EE 的应用程序服务器为您提供了哪些功能,而您无法通过某些第 3 方子系统轻松地从 Tomcat 获得这些功能?

正如我所说,我认为“粘合剂”是附加值的一部分,对整体的坚固性有很大贡献。然后,ewernli的回答很好地强调了实现的困难。我只想补充一下:

  • 集群和故障转移(以实现容错)
  • 行政设施

是的,一个好的 Java EE 服务器会做一些非常巧妙的事情来提高容错能力(连接池集群、JNDI 树、JMS 目标、使用幂等 bean 自动重试、智能 EJB 客户端、事务恢复、服务迁移等)。对于“关键任务”应用程序(绝大多数不是),这一点很重要。在这种情况下,Servlet API 之上的库在我看来并不能替代。