JavaServer Faces Bean 实例化顺序

Iva*_*iev 2 jsf

对于 JSF 创建其托管 Bean 的顺序有任何保证吗?

我的情况大致如下:我在同一页面中使用了 2 个 bean。创建第二个时,我希望它从第一个获取一些信息,例如在其 @PostConstruct 方法中(以避免访问数据库)。

有什么方法可以确保第一个 bean 实际上在第二个 bean 之前创建,以便成功获取数据?

Bal*_*usC 5

您可以通过将一个 bean 作为另一个 bean 的托管属性注入来确保这一点。

假设您已经使用 JSF 2.0,请使用@ManagedProperty

@ManagedBean
@RequestScoped
public class FirstBean {
    // ...
}
Run Code Online (Sandbox Code Playgroud)
@ManagedBean
@RequestScoped
public class SecondBean {

    @ManagedProperty(value="#{firstBean}")
    private FirstBean firstBean; // +setter

    @PostConstruct
    public void init() {
        // firstBean is available here.
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

或者当您仍在使用 JSF 1.2 时,请使用<managed-property>in faces-config.xml

<managed-bean>
    <managed-bean-name>firstBean</managed-bean-name>
    <managed-bean-class>com.example.FirstBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
</managed-bean>

<managed-bean>
    <managed-bean-name>secondBean</managed-bean-name>
    <managed-bean-class>com.example.SecondBean</managed-bean-class>
    <managed-bean-scope>request</managed-bean-scope>
    <managed-property>
        <property-name>firstBean</property-name>
        <value>#{firstBean}</value>
    </managed-property>
</managed-bean>
Run Code Online (Sandbox Code Playgroud)