繁体   English   中英

@SessionScoped (CDI) 和 @Stateful (Java EE) 之间的区别

[英]Diff between @SessionScoped (CDI) and @Stateful (Java EE)

我了解到 CDI Beans 可用于不同的基于 Web 应用程序的范围(仅在那里,对吧?)。 例如:@RequestScoped、@SessionScoped 等。 @SessionScoped 通过完整的浏览器会话将数据保存在托管 bean 中。 这在逻辑上听起来很安静,因为注释名称描述了它的作用。 但是 - 现在我仔细研究了 EJB 会话 bean。 到目前为止,我知道,这样的一个状态可能具有以下三种状态之一:@Stateless、@Stateful 和 @Singleton。 对我来说,这些和 CDI bean 的注释之间似乎有直接的可比性:@RequestScoped --> @Stateless、@SessionScoped --> @Stateful、@ApplicationScoped --> @Singleton。 但是由于我正在研究一些示例,我发现了一个包含 @Stateful 和 @SessionScoped 注释的 bean。 我寻找了解释 - 但我没有找到任何可以理解的答案。 那么,究竟有什么区别呢? 为什么我必须同时使用这两个注释? 谢谢你。

CDI Beans 可用于不同的基于 Web 应用程序的范围(仅在那里,对吧?)。

错误的。 CDI bean 可以在您想要的任何地方使用 - DB 连接/通信、业务逻辑、基于事件的编程,甚至在 Java SE 中(焊接,CDI 的参考实现,现在也提供了)。 但是,特别是@SessionScoped bean 在 HTTP 会话中比其他任何地方都更有意义。 但是您仍然可以将会话想象(和使用)作为具有标记开始和结束的给定时间段。 在这些边界内,会话存在 - 不需要是 HTTP 会话,但它是最明显的会话。

这些与 CDI bean 的注释之间的直接可比性:@RequestScoped --> @Stateless、@SessionScoped --> @Stateful、@ApplicationScoped --> @Singleton。

又错了。 EJB 仅与 Web 通信相关联,而 CDI 则不然。 同样基于您选择的注释,您还可以选择一个容器 (CDI/EJB),它将负责该 bean。 CDI 集成了所有 EJB bean(创建一个代理并使它“看起来像”一个 CDI bean - 允许您在 EJB bean 中使用 CDI 的东西)。

现在,例如, @Stateless在 CDi/Weld 中内部表示为@Dependent范围而不是@RequestScoped因为 EJB 中的@Stateless bean 被重用,您无法真正了解它们的状态。 在 CDI 中使用@RequestScoped时,您激活请求上下文(让我们坚持使用 HTTP,因此通过发送某些内容来激活它),这会触发所有@RequestScoped bean 的创建 请求后所有这些 bean 都被销毁,不再使用。 所以你可以完全依赖你放入的东西,你也可以确保它在请求后不会存活。

另一个故事是@ApplicationScoped@Singleton 这些确实非常相似,最重要的细节可能是 CDI 创建自己的 bean 代理这一事实。 但这对于这个问题来说太详细了,我认为您现在可以认为它们具有可比性。

@SessionScoped (CDI) 和 @Stateful (Java EE) 之间的区别

现在终于到了原来的问题。 我认为要大致掌握这些差异,您需要了解 CDI 在上下文中运行的事实。 它总是激活上下文(在这种情况下是会话上下文),并且此时一组@SessionScoped bean 出现,您可以与它们通信,它们具有值和状态等。上下文相互交错,因此同时请求上下文可能存在并且应用上下文确实存在。 所以我们可以说@SessionScoped与会话绑定并由容器控制,而@Stateful为您提供了一个用户管理的会话,其生命周期由客户端管理,并且在此基础上还添加了许多其他功能。

有时您可以在一个 bean 上看到两个注释的原因是人们将它们结合起来以获得两全其美 - 容器管理的生命周期和添加的功能。 但请注意,虽然@Stateful使用不多(选择加入@Stateless通常更有意义),但@SessionScope更加通用,几乎适用于任何基于会话的场景。

希望它至少能说明一些问题,恐怕这是一个非常复杂的话题。

EJB Beans 默认给你事务,CDI Beans 不。

我认为这就是区别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM