2011-03-24 37 views
2

对JSF创建托管bean的顺序有任何保证吗?JavaServer Faces Bean实例化顺序

我的情况几乎如下: 我有2个豆,我在同一页中使用。创建第二个时,我希望它从第一个获取一些信息,例如在其@PostConstruct方法中(以避免碰到数据库)。

有没有什么办法可以确保第一个bean实际上是在第二个之前创建的,所以让数据成功?

回答

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> 
+0

谢谢,这是有效的。 (我很确定我已经知道,在某些时候:)) 除了这个,是以随机顺序构造的bean? – 2011-03-25 13:40:56

+1

不,它们是在UI组件树中按照EL表达式的顺序构造的,它们仅在所需范围内都不存在时才构造。 – BalusC 2011-03-25 13:47:58

+0

好的,有道理。非常感谢。 – 2011-03-25 14:50:11