在 JSF 中如何以及何时销毁 @ViewScoped bean?

Posted

技术标签:

【中文标题】在 JSF 中如何以及何时销毁 @ViewScoped bean?【英文标题】:How and when is a @ViewScoped bean destroyed in JSF? 【发布时间】:2013-02-22 07:28:36 【问题描述】:

@RequestScoped@SessionScopedBean 的生命周期 托管 bean 由 Servlet 容器本身管理,因为它们基本上分别存储为 HttpRequestHttpSession 的属性。 JSF 如何管理 @ViewScopedBean 的生命周期?我知道它是在创建视图时创建的,并且在回发到另一个视图之前一直可用。但我发现,在我们从那个视图移开后,它并没有立即收集垃圾。

【问题讨论】:

一旦托管 bean 操作方法返回一个有效的导航案例结果,即使它是针对同一个视图,视图范围的托管 bean 也会被丢弃并重新创建。阅读此balusc.blogspot.co.il/2011/09/communication-in-jsf-20.html,这是他们存储的位置:***.com/a/9177769/617373 嗯,实际上,您不应该能够预测 gc 或让它立即发生,是吗?但关于 mojarra 中的 viewscoped beans,请参阅 ***.com/a/13097208/1530938 垃圾收集是异步的。当视图范围被“销毁”时,它实际上只是“标记为准备好被垃圾收集”,就像所有其他 java 对象一样。注意:标记实际上是 0 的引用计数(即标记为“不再使用”)。 【参考方案1】:

它将被销毁

执行了具有非null 结果的回发,

或者,会话中(逻辑)视图的数量已超过,并且特定视图是 LRU 链中的第一个(在 Mojarra 中,可通过 com.sun.faces.numberOfViewsInSessioncom.sun.faces.numberOfLogicalViews 上下文参数进行配置,每个参数都有默认值为 15),

或者,会话中的活动视图范围的数量已超过(在 Mojarra 中,这是 25 的硬编码限制),另请参阅 JSF 2.2 Memory Consumption: Why does Mojarra keep the ViewScoped Beans of the last 25 Views in Memory?

或者,会话已过期。

因此,当由于单击指向另一个页面的 GET 链接、刷新页面或关闭浏览器选项卡/窗口而卸载页面时,它不会被破坏。在满足上述条件之一之前,bean 将一直存在。无论如何要在卸载期间销毁它,请考虑改用OmniFaces @ViewScoped

【讨论】:

LRU 是什么意思?最近最少使用?还有你所说的逻辑视图是什么意思? 1) 是的。它们存储在 LRU 映射中,按上次使用排序。最近最少使用的是第一个条目。 2) 见***.com/questions/12562469/… @BalusC,有什么解决方案可以更快地销毁 viewscoped beans 吗? ominfaces viewscoped 注释会对此有所帮助吗? 在 icefaces 中有一个注解 @WindowDisposed.on 浏览器关闭自身,视图将被垃圾收集 也许添加一些关于 js 的信息以便在“卸载”时立即执行?

以上是关于在 JSF 中如何以及何时销毁 @ViewScoped bean?的主要内容,如果未能解决你的问题,请参考以下文章

JSF 中的“绑定”属性如何工作?何时以及如何使用它?

JSF 中的“绑定”属性如何工作?何时以及如何使用它?

返回在 jsf 中销毁的会话的欢迎页面 [重复]

JSF 何时评估 EL 表达式

在 JSF 登录期间何时创建会话?

无论如何要知道何时销毁池线程(或 ThreadStatic 成员)?