Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jakarta ee @SessionScoped(CDI)和@Stateful(JavaEE)之间的差异_Jakarta Ee_Annotations_Cdi_Stateful_Session Scope - Fatal编程技术网

Jakarta ee @SessionScoped(CDI)和@Stateful(JavaEE)之间的差异

Jakarta ee @SessionScoped(CDI)和@Stateful(JavaEE)之间的差异,jakarta-ee,annotations,cdi,stateful,session-scope,Jakarta Ee,Annotations,Cdi,Stateful,Session Scope,我了解到CDIBean可以在不同的基于web应用程序的范围内使用(只有在那里,对吗?)。例如:@RequestScoped、@SessionScoped等等@SessionScoped在整个浏览器会话中将数据保存在托管bean中。这在逻辑上听起来很安静,因为注释名称描述了它的功能。 然而,现在我仔细研究了EJB会话bean。到目前为止,我知道,这样一种状态可能有三种状态之一:@无状态,@有状态和@Singleton。 对我来说,这些和CDIBean的注释之间似乎有直接的可比性:@RequestS

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

默认情况下,EJB bean会为您提供事务, CDI豆没有

我想这就是区别

CDIBeans可以在不同的基于web应用程序的范围内使用(只有在那里,对吗?)

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

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

又错了。EJB只链接到web通信,CDI则不是。同样根据您选择的注释,您还可以选择一个容器(CDI/EJB),该容器将负责该bean。CDI集成了所有EJB bean(创建一个代理并使其“看起来”是一个CDIBean——允许您在EJB bean中使用CDI内容)

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

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

@SessionScoped(CDI)和@Stateful(JavaEE)之间的差异

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

有时您可以在一个bean上看到两个注释的原因是,人们将它们结合起来,以充分利用这两个世界—容器管理的生命周期和添加的特性。但请注意,
@Stateful
现在使用得不多(选择
@Stateless
通常更有意义),而
@SessionScope
则更具通用性,几乎适用于任何基于会话的场景


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

CDIBean和EJB bean都是托管bean。它们共享许多基本内容,EJBbean支持事务是正确的。但这并不是唯一的区别,否则同时使用“@Stateful”和“@SessionScoped”将毫无意义;)主要是:CDI的
@SessionScoped
与当前HTTP会话绑定
@Stateful
不识别HTTP会话,它只是在池中保持活动状态,而不考虑客户端的会话状态。还有其他基于用例的区别,但这是主要区别