为什么JSF,根据请求更新视图的一部分实例化页面上的所有bean而不是页面的那一部分使用的bean?

时间:2012-07-21 05:25:39

标签: java jsf jsf-2

我一直注意到页面中使用的所有bean在更新页面的任何一小部分时都会被不必要地实例化。好的,它们是请求作用域,因此将在每个请求上实例化,但只有当正在更新的页面部分需要那些bean时才应该这样做。不是吗?

为什么JSF中这个糟糕的设计?

更新

我找到导致此行为的真正罪魁祸首,我在网页的某些位置f:event type="preRenderView"。这实际上导致重新实例化这些bean以调用监听器。修复方法是使用f:event type="preRenderComponent"代替。这减少了每个请求中大多数不必要的bean实例化,但我仍然看到一些不必要的bean实例化。

2 个答案:

答案 0 :(得分:4)

在这种情况下,只有在构建视图时才会构造bean(读取:在标记处理程序的任何属性或idbinding属性中引用了其中一个属性一个UI组件)。否则它将不会被构建。至少,在“通常的方式”设计JSF视图时,我无法在Mojarra 2.1.11(以及2.0.0中)中重现您的问题。

无法部分构建视图,但可以部分保存和恢复其状态,并且可以部分呈现UI组件树。

您在“JSF中的糟糕设计”投诉中没有任何争议。

另见:

答案 1 :(得分:2)

希望我能正确解释你的问题!

您的页面是由表单提交的,因此首次检索或构建组件树(JSF生命周期的第一步)。

组件树由所有内容组成,而不仅仅是您当前所在的视图。

因此,在此阶段,任何绑定到任何请求范围bean的JSF组件都会被实例化。

一个很好的例子就是tabView。想象一个带有四个选项卡的tabView,每个选项卡绑定到一个不同的页面,每个选项卡都绑定到相应的请求范围的辅助bean。

尽管并非所有选项卡同时可见,但它们都是组件树的一部分,因此,如果设置断点,您将看到为请求阶段的每个页面实例化的bean。 / p>