2011-03-24 60 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