[英]Update the value of a Spring bean property using SpEL
我正在使用Spring 3創建一個Web應用程序,並希望利用Spring Expression Language的強大功能,但遇到了問題。 我需要將一個bean上的屬性值設置為另一個bean上方法調用的結果。 我知道我可以這樣做,但問題是該方法調用的結果可能會在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不適用於我的具體情況。
如果你將范圍設置為原型,那么每次Spring加載你的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框架。
#{guestlist.size()}的示例僅設置屬性的初始值,而不是用於使屬性保持最新的策略。 假設您沒有使用延遲加載,Spring會在啟動時從應用程序上下文實例化Spring托管的bean。 從那時起,由開發人員來處理更新屬性值。
我想最簡單的方法是將列表( guestList
)注入到bean中,並在每次需要numberOfGuests
從Java代碼手動調用其.size()
方法,即:
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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.