2014-07-26 145 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区分他们。 –

相关问题