2015-01-31 101 views
0

我可能在这里错了,但我无法弄清楚为什么Spring会从Singleton类创建2个不同的对象。以下是代码:为什么Spring会从Singleton类创建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> 

预计使用“原型”的范围,但是,为什么会“原型”创建2个对象,以得到一个正常的类不同的对象来自Singleton类?

回答

2

两件事。一,Spring不知道(而且真的不在乎)你的班级是如何设置的。你已经实现了一个编程模式的事实对Spring没有任何意义。二,Spring使用反射来实例化你声明的bean类型,因此可以使用你的private构造函数。

每当你从Spring请求一个原型scoped bean时,它都会创建一个bean的新实例。

+0

@Scotirios我有一个预感,Spring必须通过反射来加载类,因此是预期的行为。感谢您的确认。 – bluelurker 2015-01-31 18:45:01

3

仅仅因为你在静态字段中创建了一个单例,所以这对spring没有影响。春天根本不知道这一点。

原型范围只意味着:当调用getBean时返回一个新实例。

单例作用域意味着:创建一个实例并始终返回此实例。

1

如果不直接设置如何实例化bean,Spring会使用反射来调用创建bean的构造函数。除了使用默认的单例作用域外,还可以在xml配置中将factory-method设置为getInstance,以告诉Spring如何创建bean。

相关问题