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

Gee*_*eek 15 jsf destroy jsf-2 managed-bean view-scope

所述的生命周期 @RequestScoped@SessionScopedBean 管理豆由Servlet容器自身管理,因为它们是基本上作为一个属性存储HttpRequestHttpSession分别.JSF如何管理生命周期@ViewScopedBean?我知道它是在创建视图时创建的,并且可以使用,直到有回发到另一个视图.但是我发现在我们离开那个视图后不会立即收集垃圾.

Bal*_*usC 30

它会被摧毁

  • null已经执行了一个没有结果的回发,

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

  • 或者,会话中的actieve视图范围的数量已超过(在Mojarra中,这是25的硬编码限制),另请参阅JSF 2.2内存消耗:为什么Mojarra保留了内存中最后25个视图的ViewScoped Bean?

  • 或者,会话已过期.

因此,当单击GET链接到另一个页面,刷新页面或关闭浏览器选项卡/窗口时,页面被卸载时不会被销毁.豆子会活得很久,直到满足一个新的条件.无论如何要在卸载期间销毁它,请考虑使用OmniFaces@ViewScoped.

  • 1)是的.它们存储在LRU映射中,按上次使用顺序排列.最近最少使用的是第一个条目.2)参见http://stackoverflow.com/questions/12562469/how-can-i-set-the-view-timeout/12564632#12564632 (2认同)