JSF 2.0:为什么在未呈现的组件中使用JSF bean时会创建它?

Tuu*_*nen 3 jsf dependency-injection javabeans jsf-2

让我们有一个非常简单的复合组件:

<cc:implementation>
    #{testBean.someField}
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)

豆为它:

public class TestBean {

    private boolean someField = false;
    public boolean getSomeField() { return someField; }

    @PostConstruct
    public void init() {
        System.out.println("PostConstruct");
    }

}
Run Code Online (Sandbox Code Playgroud)

然后像往常一样调用它但不显示它:

<codeEditor:test rendered="#{false}" />
Run Code Online (Sandbox Code Playgroud)

发生的事情是组件永远不会被渲染,并且bean永远不会像人们想象的那样被启动.

但是,如果我们将组件更改为:

<cc:implementation>
    <h:outputText value="#{testBean.someField}" />
</cc:implementation>
Run Code Online (Sandbox Code Playgroud)

发生的事情是组件仍然永远不会被渲染(因为rendered属性是false),但是,bean确实被实例化了.出现这种情况总是当我们用一个bean属性一些本地的JSF组件内部(h:panelGroup,h:inputHidden,等等).

为什么会这样?

Bal*_*usC 6

组件(以及所有绑定的bean)在视图构建期间创建.渲染属性仅在视图渲染时评估.它一直在JSF中以这种方式工作.

如果bean在构造期间做了一些昂贵的工作,那么我建议让那个昂贵的工作依赖于你在render属性中重用的一些条件.