3

我是 EJB 的新手,最近开始研究 EJB (3.0)。我已经使用 Java 6 年了,但之前从未使用过 EJB。至少可以说,整个 EJB 业务的复杂性让我不知所措。我不明白我可以在哪里实际应用一些概念。

在理解了无状态会话 bean 后,我想到的一个问题是,你能不能总是用没有本地成员的类的共享实例替换无状态会话 bean(有效地使其无状态)?我读到了关于无状态会话 bean 的实例池。如果没有状态,你不能简单地使用一个实例吗?

我在 OpenEJB 上部署我的示例,我必须使用无状态会话 bean 的一个地方是与 EntityManager 交互。我不确定是否可以在任意类中处理 EntityManager。除此之外,仍然对无状态会话 bean 试图解决什么问题感到困惑。

4

3 回答 3

10

无状态会话 bean 可能有状态。但它可能没有会话状态。因此,会话 bean 方法执行以下操作是完全可以接受的(尽管是不好的做法):

public void foo() {
    this.someVar = bar();
    this.someOtherVar = baz();
    zing();
}

除了池化之外,EJB 容器还提供了几个带有无状态 bean 的服务:

  • 依赖注入
  • 声明式事务划分
  • 声明性安全
  • 访问 EJB 上下文
  • 等等

因此,无状态会话 bean 比简单的无状态单例有用得多。

于 2012-04-18T08:19:18.917 回答
4

不,无状态会话 bean 可以有状态,但该状态没有被持久化/绑定到会话。该状态的一部分是注入的 EJB 或其他可能是有状态 bean 等的 POJO。因此,每个请求都需要一个无状态会话 bean。

相比之下,您有一个专用于一个用户会话的有状态会话 bean,因此该状态绑定到该会话。

于 2012-04-18T08:18:44.203 回答
0

您可以在任意类中处理 EntityManager,但真正的问题是您希望如何构建您的解决方案。

除了使用 EJB 的 EJB 复杂性之外,它还为您提供了一个更具可扩展性的解决方案。

如前所述,当您开发基于事务的应用程序时,EJB 很有用。应用服务器为您提供了一些功能,如事务管理、EJB 池、安全性等。

当然,您可以使用“共享类”来实现所有东西,但是当您已经拥有所有东西时,为什么还要重新发明轮子呢?

无状态会话 bean 用于实现应用程序核心部分的业务逻辑。在 Java EE 分层架构中,您有 3 层:1. 表示 2. 业务 3. 数据

EJB 在业务逻辑中扮演着重要角色。您有两种选择 SLSB 和 SFSB。第一个更具可扩展性,并由应用程序服务器汇集,但无法保持其状态。第二个是可扩展性较差的,每个客户端会话都有一个 SFSB。当您必须在客户端之间进行业务逻辑对话时使用它们,例如仅通过对 SFSB 的一次方法调用无法完成的操作。SLSB 和 SFSB 可以持有对 EntityManager 的引用来管理实体持久性,即使我建议您只使用 SLSB 来管理持久性。EJB3 和 JPA 是一个很好的解决方案。希望这对你有帮助

于 2012-08-08T07:46:59.553 回答