为什么 Spring 从 Singleton class 创建 2 个对象?
Why would Spring create 2 objects from Singleton class?
我在这里可能是错的,但我无法弄清楚为什么 Spring 从单例 class 创建 2 个不同的对象。以下是代码:
public class DbSingleTOn {
private static DbSingleTOn dbSingleTOn = new DbSingleTOn();
private DbSingleTOn() {
}
public static DbSingleTOn getInstance() {
return dbSingleTOn;
}
}
public class MyApp {
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext(
"spring-singleton.xml");
DbSingleTOn dbSingleTOn = context.getBean(DbSingleTOn.class);
System.out.println(dbSingleTOn.hashCode());
DbSingleTOn dbSingleTOn1 = context.getBean(DbSingleTOn.class);
System.out.println(dbSingleTOn1.hashCode());
context.registerShutdownHook();
}
}
Output:
18885489
17045421
Spring 配置 XML:
<bean id="bean1" class="com.singleton.DbSingleTOn" scope="prototype" >
</bean>
使用 "prototype" 作用域,正常的 class 应该得到不同的对象,但是,为什么 "prototype" 从 Singleton class 创建 2 个对象?
两件事。第一,Spring 不知道(而且真的不关心)你的 class 是如何设置的。您已经实现了一种编程模式这一事实对 Spring 没有任何意义。第二,Spring 使用反射来实例化您声明的 bean 类型,因此可以使用您的 private
构造函数。
每次您从 Spring 请求原型作用域 bean 时,它都会创建一个新的 bean 实例。
仅仅因为您在静态字段中创建了单例,这不会对 spring 产生影响。 Spring 根本不知道这一点。
原型作用域仅表示:return 调用 getBean
时的新实例。
Singleton 范围意味着:创建一个实例一次并且总是return这个。
如果您不直接设置如何实例化 bean,Spring 使用反射调用构造函数来创建 bean。除了使用默认单例范围外,您还可以在 xml 配置中将 factory-method
设置为 getInstance
以告诉 Spring 如何创建 bean。
我在这里可能是错的,但我无法弄清楚为什么 Spring 从单例 class 创建 2 个不同的对象。以下是代码:
public class DbSingleTOn {
private static DbSingleTOn dbSingleTOn = new DbSingleTOn();
private DbSingleTOn() {
}
public static DbSingleTOn getInstance() {
return dbSingleTOn;
}
}
public class MyApp {
public static void main(String[] args) {
AbstractApplicationContext context = new ClassPathXmlApplicationContext(
"spring-singleton.xml");
DbSingleTOn dbSingleTOn = context.getBean(DbSingleTOn.class);
System.out.println(dbSingleTOn.hashCode());
DbSingleTOn dbSingleTOn1 = context.getBean(DbSingleTOn.class);
System.out.println(dbSingleTOn1.hashCode());
context.registerShutdownHook();
}
}
Output:
18885489
17045421
Spring 配置 XML:
<bean id="bean1" class="com.singleton.DbSingleTOn" scope="prototype" >
</bean>
使用 "prototype" 作用域,正常的 class 应该得到不同的对象,但是,为什么 "prototype" 从 Singleton class 创建 2 个对象?
两件事。第一,Spring 不知道(而且真的不关心)你的 class 是如何设置的。您已经实现了一种编程模式这一事实对 Spring 没有任何意义。第二,Spring 使用反射来实例化您声明的 bean 类型,因此可以使用您的 private
构造函数。
每次您从 Spring 请求原型作用域 bean 时,它都会创建一个新的 bean 实例。
仅仅因为您在静态字段中创建了单例,这不会对 spring 产生影响。 Spring 根本不知道这一点。
原型作用域仅表示:return 调用 getBean
时的新实例。
Singleton 范围意味着:创建一个实例一次并且总是return这个。
如果您不直接设置如何实例化 bean,Spring 使用反射调用构造函数来创建 bean。除了使用默认单例范围外,您还可以在 xml 配置中将 factory-method
设置为 getInstance
以告诉 Spring 如何创建 bean。