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/Grails 应用的静态分析工具

JSF 2 应用程序中的默认托管 Bean 范围是啥?

是否在会话范围的 JSF 支持 bean 中观察到 CDI 事件

如何(以及何时?)在 JSF 2.0 中删除 Session 范围的 bean

如何在 JSF 中正确使用组件绑定? (会话范围 bean 中的请求范围组件)

JSF 请求范围的 bean 不断在每个请求上重新创建新的有状态会话 bean?