簡體   English   中英

使用SpEL更新Spring bean屬性的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM