2010-11-19 72 views
0

我使用Spring 3創建了一個Web應用程序,並希望利用Spring表達式語言的力量,但遇到了問題。我需要將其中一個bean的屬性值設置爲另一個bean上方法調用的結果。我知道我可以做到這一點,但問題是該方法調用的結果可能會在bean初始化後發生變化,我需要該屬性來反映更改。例如:使用SpEL更新Spring bean屬性的值

<beans> 
... 
<bean name="guestList" class="java.util.ArrayList"></bean> 

<bean name="party" class="some.custom.class.Party"> 
    <property name="numberOfGuests" value="#{guestList.size()}" /> 
</bean> 
... 
</beans> 

從我所知道的,numberOfGuests字段設置首次party字段訪問。但在party字段被訪問後,訪客人數可能會改變,我需要numberOfGuests字段來反映這一點。當我需要更新值時,有沒有辦法在我的應用程序中重新初始化numberOfGuests字段?

這只是一個例子,直接訪問guestList bean不適用於我的具體情況。

回答

2

如果您將範圍內的每個彈簧加載你的bean應該重新計算的嘉賓名單大小時間爲原型則:

<bean name="party" class="some.custom.class.Party" scope="prototype"> 

所以,party變成樣機,但guestList可以留單(這是默認的範圍)。

這裏有一個問題是:如果你有另外一個bean,像partyHost(這是一個單),並獲取與party注射(這是一臺樣機),partyHost將永遠不會得到party另一個實例,因爲partyHost是單例,並且只獲得一次注入的依賴關係。因此,要實現這一點,所有需要更新客人列表大小的bean以及所有引用它們的bean等都必須是原型。

要麼,要麼你必須通過他們的API直接詢問Spring。如果您使用API​​,則可以隨時調用它並獲取原型bean的新實例,並因此更新來賓列表大小。

applicationContext.getBean("myPrototype"); 

但是,如果可以的話,最好避免使用Spring API。通常開發人員不希望被耦合到DI框架。

0

#{guestlist.size()}的示例僅設置屬性的初始值,而不是用於保持最新的策略。假設你沒有使用延遲加載,Spring在啓動時從應用程序上下文中實例化Spring管理的bean。從這一點開始,開發人員需要處理更新的屬性值。

0

我猜最簡單的辦會注入名單(guestList)到bean,並調用其.size()從Java代碼,每次手工方法需要numberOfGuests,即:

package some.custom.class; 

public class Party { 
    private List<?> guestList; 
    // getter & setters 

    public int getNumberOfGuests() { 
    return guestList!=null ? guestList.size() : 0; 
    } 

} 

和...

<bean name="party" class="some.custom.class.Party"> 
    <property name="guestList" ref="guestList"/> 
</bean> 
+0

這絕對是最簡單的(也是首選!)方法,但OP表示「這只是一個例子,直接訪問guestList bean不適用於我的具體情況。」 – 2010-11-23 21:42:34

+0

你說得對。採取的點。我們當然需要更多的信息。直接訪問'guestList' bean有什麼問題? – 2010-11-23 21:59:38