2
对JSF创建托管bean的顺序有任何保证吗?JavaServer Faces Bean实例化顺序
我的情况几乎如下: 我有2个豆,我在同一页中使用。创建第二个时,我希望它从第一个获取一些信息,例如在其@PostConstruct方法中(以避免碰到数据库)。
有没有什么办法可以确保第一个bean实际上是在第二个之前创建的,所以让数据成功?
对JSF创建托管bean的顺序有任何保证吗?JavaServer Faces Bean实例化顺序
我的情况几乎如下: 我有2个豆,我在同一页中使用。创建第二个时,我希望它从第一个获取一些信息,例如在其@PostConstruct方法中(以避免碰到数据库)。
有没有什么办法可以确保第一个bean实际上是在第二个之前创建的,所以让数据成功?
您可以通过注入一个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>
谢谢,这是有效的。 (我很确定我已经知道,在某些时候:)) 除了这个,是以随机顺序构造的bean? – 2011-03-25 13:40:56
不,它们是在UI组件树中按照EL表达式的顺序构造的,它们仅在所需范围内都不存在时才构造。 – BalusC 2011-03-25 13:47:58
好的,有道理。非常感谢。 – 2011-03-25 14:50:11