@RequestScoped
和@SessionScopedBean
的生命周期由Servlet容器自己管理,因为它们基本上被存储为HttpRequest
和HttpSession
的属性。那么JSF如何管理@ViewScopedBean
的生命周期呢?我知道它在视图创建时被创建,并且在提交到不同视图的postback之前可用。但是我发现,在我们从该视图移动后,它并不会立即被垃圾回收。
@RequestScoped
和@SessionScopedBean
的生命周期由Servlet容器自己管理,因为它们基本上被存储为HttpRequest
和HttpSession
的属性。那么JSF如何管理@ViewScopedBean
的生命周期呢?我知道它在视图创建时被创建,并且在提交到不同视图的postback之前可用。但是我发现,在我们从该视图移动后,它并不会立即被垃圾回收。
在以下情况下,它将被销毁:
执行非null
结果的postback时
或者,在会话中的逻辑视图数已超过且特定视图是LRU链中的第一个(在Mojarra中,这可以通过com.sun.faces.numberOfViewsInSession
和com.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
。