JSF 静态 Bean 变量范围
Posted
技术标签:
【中文标题】JSF 静态 Bean 变量范围【英文标题】:JSF Static Bean Variable Scope 【发布时间】:2011-10-17 20:13:47 【问题描述】:所以,我看到了这个帖子: JSF - session scoped bean shared by browsers on different machines
但这是两年前的一个问题,所以我不知道从那时起 JSF 世界是否有任何更新,我也有一些更具体的案例需要澄清。 基本上,我想知道的是如何在具有不同范围的 bean 中处理静态范围变量。例如:
@ManagedBean
@ApplicationScoped
public class ApplicationBean
static private int someStaticInt=0;
...
由于这个 bean 是应用程序范围的,我完全希望 someStaticInt 由应用程序的所有用户共享,即用户 A 将值设置为 3,所有用户从此将该值视为 3。如果我是,请纠正我错了。
但是这种情况呢:
@ManagedBean
@ViewScoped
public class ViewScopeBean
static private int staticInt = 0;
private SomePOJO myClass;
...
public void someAction()
SomePOJO.memberStaticInt++;
...
...
public SomePOJO
static private int memberStaticInt = 0;
...
现在,这个 bean 是 ViewScoped,因此应用程序的每个用户都有一个单独的实例。但是那个静态整数呢?如果我增加它,它只会在我的 Bean 实例中,还是会为所有用户增加。此外,那个成员对象 myClass 呢?它没有在 bean 中声明为静态的,但它本身有一个静态成员。如果我运行 someAction,memberStaticInt 会为所有用户增加还是只为使用该 Bean 实例的用户增加?
最后,我很想知道上述案例中的所有此类逻辑是否也适用于 RequestScoped bean。
【问题讨论】:
如果static
表现得像非static
成员,那么static
的意义是什么,你觉得呢?
基本上,如果我只能在 bean 的范围内静态引用变量,例如,在特定用户的会话中,这有时可能是有益的。例如,在现实世界的场景中,我的 SomePOJO 类实际上是该类的对象的集合,但它们有一个成员变量,只能为该用户在所有对象之间共享——如果我能做到那就太好了静止的。但如果该静态成员在所有会话中都相同,则不会!
【参考方案1】:
JSF 范围不会改变静态的含义。静态仍然意味着静态,因此无论您的 JSF 范围如何,该值都将由同一 VM 中该类的所有实例共享。
【讨论】:
以上是关于JSF 静态 Bean 变量范围的主要内容,如果未能解决你的问题,请参考以下文章
是否在会话范围的 JSF 支持 bean 中观察到 CDI 事件
如何(以及何时?)在 JSF 2.0 中删除 Session 范围的 bean