CommandButton不必要地重新实例化视图中使用的其他几个托管bean

时间:2011-12-24 03:19:49

标签: java jsf jsf-2

我注意到当我使用h:commandButton从托管bean调用actionlistener方法时,在当前视图页面上使用的托管bean会自行重新实例化。现在,由于我已经获取了来自这些bean的数据并将其添加到视图中,因此无需重新实例化这些bean,但JSF会这样做。

我使用以下代码调用方法

<h:commandButton value="Increment" actionListener="#{channelController.increment()}"/>

我发现另一个托管bean UserChannelsList是自己实例化的。我没有向这个bean提交任何数据,或者使用它的任何方法,视图都不需要从这个bean中获取任何属性。为什么JSF自己实例化视图中使用的所有这些bean?

修改

这不是actionListener属性所致,即使我删除了这个属性&amp;只需单击commandButton,然后托管bean就会自行实例化!

1 个答案:

答案 0 :(得分:0)

如果不在当前作用域中,则将创建在整个视图中引用的所有托管bean或由视图中引用的bean之一作为托管属性。所以你的观点必须直接或间接引用它。如果您无法立即在代码库中找到它,请在bean的构造函数上放置一个断点并检查调用堆栈以确定启动器。

这与使用动作侦听器无关(在没有真正的action方法的情况下,你可以在上下文中使用它,请阅读Differences between action and actionListener)。