[英]How do I keep the value of a static class variable in Spring?
所以我有這個類的例子:
public class Test {
private static int idCounter;
private int id;
Test() {
id=++idCounter;
}
public void getId() {
System.out.printf("This id is %s",this.id);
}
}
而且beans.xml配置:
<beans>
<bean id="test" class="com.Test"/>
</beans>
現在,當我嘗試創建一個ArrayList時,靜態變量每次都會重置。
for (int i=0;i<9;i++) {
arrayList.add(context.getBean("test");
arrayList.get(i).getId();
}
它將為arrayList中的每個對象打印“This is is 1”。 我怎樣才能使靜態變量保持全局值?
這里發生的事情不是你認為發生的事情。 靜態成員變量沒有重置; 你的Test
bean只有一個實例,在循環中你會查找相同的Test
bean十次。
Spring bean默認具有singleton范圍,這意味着Spring只會創建一個bean實例,每次注入或查找時都會使用它。 如果您希望每次都創建一個新實例,請給出bean原型范圍而不是默認的單例范圍:
@Scope("prototype")
public class Test {
// ...
}
如果您使用XML配置Spring bean,那么就像Andrew Logvinov在他的回答中所顯示的那樣; 添加scope
屬性:
<bean id="test" class="com.Test" scope="prototype"/>
要了解更多信息,請參閱Spring Framework參考文檔中的Bean作用域 。
默認情況下,Spring bean具有單例范圍,這意味着每個請求都返回相同的bean實例。 你需要的是一個原型范圍:
<bean id="myBean" class="com.test.MyClass" scope="prototype"/>
您已使用test
ID聲明了bean:
<beans>
<bean id="test" class="com.Test"/>
</beans>
但之后你會使用id triangle
獲得另一個bean的實例:
context.getBean("triangle")
所以,我想,這只是錯字錯誤:你獲得了另一個bean的實例,你沒有靜態id計數器。 如果我不對,請檢查您的代碼並更新問題。
Jesper的回答是正確的; 因為你將它配置為單例,只有一個類的實例,構造函數被調用一次。
但是,即使你修復了這個以使用原型范圍,它也可能無法按預期工作,原因有兩個:
++運算符不是線程安全的,請參閱預增量運算符是否是線程安全的? 。
沒有什么可以強迫您的計數器更新在線程中可見。
你應該使用像AtomicInteger這樣的東西,它將允許線程安全遞增並提供可見性保證。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.