Java 如何在Spring中保持静态类变量的值?

Java 如何在Spring中保持静态类变量的值?,java,spring,static,javabeans,Java,Spring,Static,Javabeans,我有一个课堂示例: 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>

我有一个课堂示例:

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();
}

for(inti=0;i默认情况下,Springbean具有单例作用域,这意味着每个请求都返回相同的bean实例。您需要的是一个原型作用域:

<bean id="myBean" class="com.test.MyClass" scope="prototype"/>


这里发生的事情并不是您认为正在发生的事情。静态成员变量没有重置;只有一个
Test
bean实例,在循环中,您正在查找相同的
Test
bean十次

默认情况下,Spring bean具有singleton作用域,这意味着Spring将只创建bean的一个实例,每次注入或查找该实例时都会使用该实例。如果希望每次都创建一个新实例,请指定bean prototype作用域,而不是默认的singleton作用域:

@Scope("prototype")
public class Test {
    // ...
}
如果您使用XML配置Springbean,那么请按照Andrew Logvinov在其回答中所示进行;添加一个
scope
属性:

<bean id="test" class="com.Test" scope="prototype"/>


要了解更多信息,请参阅Spring框架参考文档中的。

您已声明使用
test
id:

<beans>
    <bean id="test" class="com.Test"/>
</beans>
所以,我想,这只是输入错误:您获得了另一个bean的实例,其中没有静态id计数器。检查您的代码并更新问题,如果我不正确。

是正确的;因为您将其配置为singleton,所以类只有一个实例,构造函数会被调用一次

但是,即使您将其修复为使用prototype scope,它也可能无法按预期工作,原因有两个:

  • ++运算符不是线程安全的,请参阅

  • 没有任何东西会强迫计数器的更新在线程之间可见


您应该使用类似的方法,它将允许线程安全递增并提供可见性保证。

因为默认作用域是singleton,所以每次都会得到相同的bean/对象,所以它显示相同的值。尝试将作用域设置为prototypeI我想知道:为什么要使用
getBean(“三角形”)
而不是
getBean(“测试”)
?他在使用xml,你能用xml发布吗?
context.getBean("triangle")