我在我的Spring Web应用程序中定义了一个bean,我希望只有一个实例,这是我的bean定义:
<bean id="accessControl" class="my.spring.app.AccessControl" />
在AccessControl的构造函数中,我为对象分配了一个标识符,类似于这样:
public class AccessControl {
private long id = 0;
public AccessControl() {
id = System.currentTimeMillis();
}
public long getAccessControlId() {
return id;
}
}
在另一个类中,我尝试获取AccessControl实例,就像这样:
ApplicationContext ctx =
new ClassPathXmlApplicationContext("acbean.xml");
AccessControl ac = (AccessControl) ctx.getBean("accessControl");
LOGGER_.info("AccessControl Identifier : " + ac.getAccessControlId());
我希望"id"的值是相同的,因为"id"的值是在构造函数中设置的,而构造函数不应该一遍又一遍地被调用,但事实却是这样。我甚至在构造函数中添加了一个日志语句,每次都会创建一个新的对象。
我已经阅读了这篇文章:http://www.digizenstudio.com/blog/2006/09/14/a-spring-singleton-is-not-a-singleton/,但我认为我没有处理两个具有不同bean标识符的相同类,并且应用程序上下文是相同的。
有人能分享一下我定义bean的方式有什么问题吗?
我也尝试过将singleton ="true"和scope ="singleton",但它们没有任何区别。
谢谢。
getBean()
时,构造函数会被调用一次还是两次? - Tomasz Nurkiewiczmain
方法中,你只是一遍又一遍地运行它吗?如果是这样的话,那么每次你运行时都会得到不同的值,因为每次运行时都会创建一个新的JVM。对象本身不能在JVM实例之外自行持久化,这是你需要自己完成的(可能需要使用数据库)。 - nicholas.hauschild