1

我已经阅读了有关使用@Stateful@SessionScoped注释及其差异的不同文章,包括这篇文章。从定义的角度来看,@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. 如果我annonations在上面的 bean 上切换两个会发生什么?会有什么影响吗?(抱歉,这听起来可能很愚蠢。我正在进入 Java EE 世界,所以我希望基础知识正确)。
  3. 根据这篇关于差异的精彩帖子:@SessionScoped vs @Stateful 和 @ApplicationScoped vs @Singleton,@ Stateful bean 几乎不用于 Web 应用程序。有没有@Stateful绝对必要的情况?
  4. @stateful关于相关说明:将bean 注入bean是否合法@ApplicatonScoped?这意味着整个应用程序只有一个@statefulbean,并且所有客户端都通过代理使用一个有状态 bean 的相同实例。(就像这里演示的那样,不要@Statefulservlets EJB 示例中注入无状态和有状态 bean 的区别)。

谢谢。

4

1 回答 1

0

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

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?

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

于 2014-10-09T08:41:42.020 回答