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