【问题标题】:@stateful and @sessionScoped - difference and when to use them correctly?@stateful 和 @sessionScoped - 区别以及何时正确使用它们?
【发布时间】:2014-12-03 14:35:41
【问题描述】:

我已经阅读了有关使用 @Stateful@SessionScoped 注释及其差异的不同文章,包括 this 帖子。从定义的角度来看,@sessionScoped 用于在客户端/Web 层之间需要/创建会话时,而在业务逻辑层中需要@Stateful。但是在实施它们时,我仍然没有掌握真正的差异。这是一个简单的例子

@Named
@SessionScoped
ShoppingCartUIBean {

 @inject 
  shoppingCart cart;
  // more code
}

@Stateful
ShoppingCart {

//business logic of adding/updating/deleting cart items
}
  1. @SessionScoped bean 如何在给定用户和服务器之间维护 Http 会话? 也就是说,如果我在不同的计算机上打开了一个购物车,我应该能够看到我的购物车,它与我的用户资料相关联。这是如何确定的?
  2. 如果我在上面的 bean 上切换两个 annonations 会发生什么?会有什么影响吗? (抱歉,这听起来可能很愚蠢。我正在进入 Java EE 世界,所以我想了解基本知识)。
  3. 根据Differences : @SessionScoped vs @Stateful and @ApplicationScoped vs @Singleton 上的这篇精彩帖子,@Stateful bean 几乎不用于 Web 应用程序。有没有绝对需要@Stateful 的情况?
  4. 相关说明:将@stateful bean 注入@ApplicatonScoped bean 是否合法?这意味着整个应用程序只有一个 @stateful bean,所有客户端都通过代理使用一个有状态 bean 的相同实例。 (正如这里演示的那样,不要在servletsEJB example for stateless and stateful beans difference 中注入@Stateful)。

谢谢。

【问题讨论】:

    标签: ejb java-ee-7 stateful session-scope


    【解决方案1】:

    我会尽力回答你的一些问题。

    Ad.1 @SessionScoped 是关于浏览器会话的,因此您不会在不同的计算机(或浏览器)上看到相同的会话。

    Ad.2 你不能仅仅因为相同的范围就认为这两个是相同的组件。基本思想是 EJB 和 JSF bean 依赖于不同的架构层。 EJB bean 应该实现业务逻辑,而 jsf bean 应该维护表单和其他 ui 组件。

    Ad.3 @Stateful bean 在 seam 框架中非常有用。使用这些 bean 和扩展的持久性上下文是延迟初始化错误的解决方案(可能这就是缝创建者使用这些 bean 的原因)。根据性能,我更喜欢无状态 bean,但这几乎不取决于用例(是否要保持状态)。

    Ad.4 通常,您不应将“范围较小”的 bean 注入“范围更大”的 bean。应用程序范围将存在,而会话可能会被销毁,这个应用程序 bean 应该有什么来代替被销毁的会话 bean?

    如果我对这些答案中的任何一个有误,请纠正我。

    【讨论】:

    • 我认为你的第四点是错误的。这是一个始终用于所有不同会话的单个会话 bean。单个会话永远不会被破坏..
    猜你喜欢
    • 2017-02-22
    • 2014-07-29
    • 1970-01-01
    • 2017-05-18
    • 1970-01-01
    • 2020-05-02
    • 2018-06-25
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多