2014-07-26 66 views
4

我創建了兩個與以下相同的類引用的bean id。我讓bean1擁有一個單例作用域,並將bean2默認爲單例。在這種情況下執行。多個bean引用同一個Singleton Bean

  1. 當我調用任一個bean時,兩個bean是否會被初始化?

  2. 是否會爲每個單獨創建兩個對象?

    <bean id="bean1" class="com.skanda.spring.core.ioc.HelloService" 
    scope="singleton" /> 
    
    <bean id="bean2" class="com.skanda.spring.core.ioc.HelloService"> 
    </bean> 
    

調用豆類

public static void main(String[] args) { 
    BeanFactory beans = new DefaultListableBeanFactory(); 
    XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(
      (BeanDefinitionRegistry) beans); 
    reader.loadBeanDefinitions(new ClassPathResource("mybeans.xml")); 
    HelloService service = (HelloService) beans.getBean("bean1"); 
} 

請指教。

Thxs,韋馱

+0

*如下*:其中?告訴我們你的代碼。 –

+0

哎呀..我錯過了。現在添加。 – skanda

+0

你爲什麼不自己測試一下?如果你可以在每個bean上調用一個方法,那麼它們就被初始化了,不是嗎?如果getBean(「bean1」)和getBean(「bean2」)返回的兩個對象不同,那意味着Spring創建了兩個實例,不是嗎? –

回答

1

你定義了兩個單身,讓你有潛在的HelloService兩個實例。如果您使用了ApplicationContext,那麼兩者都會在應用程序上下文的刷新時間初始化bean。

你只使用一個BeanFactory,所以你沒有預初始化(不刷新)。當你打電話給beans.getBean("bean1");的時候,Spring會初始化單身人士bean1,如果有的話,它會初始化它的依賴。因爲它沒有依賴關係,所以只會創建bean1,並且只有在您調用beans.getBean("bean2");時纔會創建bean2,或者Spring必須創建它才能解析另一個bean的依賴關係。

+0

我的理解是,只能有一個單例的實例,所以在這種情況下,如果bean1的範圍,即HelloService實例,那麼當調用bean2時,仍應該有一次實例。 請糾正我的理解。我是一名初學者。 – skanda

+1

'bean1'是每個對'beans.getBean(「bean1」)的調用意義上的一個Spring單例,它將返回相同的實例。而具有不同ID的'bean2'是另一個Spring單例。你可以在同一個'BeanFactory'中擁有不同的單類bean。假設你必須使用2個不同的數據庫,你將不得不'DataSourceS'的大概相同的類。但是你可以通過他們的id區分他們。 –

相關問題