JSF创建托管bean的顺序是否有任何保证?
我的情况基本如下: 我在同一页面中使用了2个bean。在创建第二个时,我希望它从第一个获得一些信息,例如在其@PostConstruct方法中(以避免命中数据库)。
有什么方法可以确保第一个bean实际上是在第二个bean之前创建的,所以获取数据会成功吗?
答案 0 :(得分:4)
您可以通过将一个bean注入另一个bean的托管属性来确保这一点。
假设您已使用JSF 2.0,请使用@ManagedProperty
:
@ManagedBean
@RequestScoped
public class FirstBean {
// ...
}
@ManagedBean
@RequestScoped
public class SecondBean {
@ManagedProperty(value="#{firstBean}")
private FirstBean firstBean; // +setter
@PostConstruct
public void init() {
// firstBean is available here.
}
// ...
}
或者当您仍然使用JSF 1.2时,请在<managed-property>
中使用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>