2015-01-31 61 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。

相關問題