为什么 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。