簡體   English   中英

如何在Spring中保留靜態類變量的值?

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

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