一尘不染

spring默认范围是单身还是没有?

spring

能否解释一下为什么Spring为下面所示的bean配置创建两个对象,因为默认情况下spring的默认作用域是singleton?

Spring配置在这里:

<bean id="customer" class="jp.ne.goo.beans.Customer"> 
    <property name="custno" value="100"></property>
    <property name="custName" value="rajasekhar"> </property>
</bean>
<bean id="customer2" class="jp.ne.goo.beans.Customer"> 
    <property name="custno" value="200"></property> 
    <property name="custName" value="siva"></property> 
</bean>

阅读 374

收藏
2020-04-13

共1个答案

一尘不染

Spring的默认范围是单例。仅仅是你对成为单身人士的含义的想法与Spring如何定义单身人士不匹配。

如果你告诉Spring制作两个具有不同ID和相同类的独立bean,那么你将获得两个独立bean,每个bean具有单例作用域。所有单例作用域的意思是,当你引用具有相同ID的对象时,你将获得相同的bean实例。

仅管理一个singleton bean的一个共享实例,所有对具有与该bean定义相匹配的id的bean的所有请求都将导致该特定的bean实例由Spring容器返回。

单例作用域意味着使用相同的ID检索相同的bean,即全部。测试没有两个ID引用相同的类会妨碍将地图用作Bean,并且通过使用BeanFactories代理事物会变得很复杂。对于Spring来说,这将涉及很多工作,却收效甚微,相反,它让用户知道他们在做什么。

为同一个bean定义两个名称的方法是使用别名:

在bean定义本身中,可以使用由id属性指定的最多一个名称和name属性中任意数量的其他名称的组合来为bean提供多个名称。这些名称可以是同一bean的等效别名,并且在某些情况下很有用,例如允许应用程序中的每个组件通过使用特定于该组件本身的bean名称来引用公共依赖关系。

但是,在实际定义bean的地方指定所有别名并不总是足够的。有时需要为在别处定义的bean引入别名。在大型系统中通常是这种情况,在大型系统中,配置在每个子系统之间分配,每个子系统都有自己的对象定义集。在基于XML的配置元数据中,你可以使用元素来完成此任务。

因此,如果你在Bean配置中添加名称:

<bean id="customer" name="customer2" 
    class="jp.ne.goo.beans.Customer">
</bean>

或为其他地方定义的bean创建别名:

<alias name="customer" alias="customer2"/>

然后“ customer”和“ customer2”将引用相同的bean实例。

2020-04-13