春季默认范围是单身吗?

Raj*_*Raj 42 java singleton spring dependency-injection spring-ioc

你能否解释为什么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>
Run Code Online (Sandbox Code Playgroud)

Nat*_*hes 60

Spring的默认范围单例.只是你对单身人士意味着什么的想法与Spring定义单身人士的方式不符.

如果你告诉Spring使用不同的id和同一个类创建两个单独的bean,那么你将得到两个单独的bean,每个bean都有singleton范围.所有单例作用域的意思是当您引用具有相同ID的内容时,您将获得相同的bean实例.

以下是Spring文档定义单例范围的方法:

只管理单个bean的一个共享实例,并且对具有与该bean定义匹配的id或id的bean的所有请求都会导致Spring容器返回一个特定的bean实例.

单例范围意味着使用相同的id检索相同的bean,即all.测试没有两个id引用同一个类会妨碍使用map作为bean,并且通过使用BeanFactories代理事物会很复杂.对于Spring来说,这将涉及大量工作而没有什么好处,相反,它相信用户知道他们正在做什么.

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

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

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

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

<bean id="customer" name="customer2" 
    class="jp.ne.goo.beans.Customer">
</bean>
Run Code Online (Sandbox Code Playgroud)

或者为别处定义的bean创建别名:

<alias name="customer" alias="customer2"/>
Run Code Online (Sandbox Code Playgroud)

那么"customer"和"customer2"将引用同一个bean实例.

  • @Rajasekhar_b_1989:我认为你的定义是错误的,请参阅我添加的 spring 文档中的引用。 (2认同)

小智 6

Spring默认范围是单例,它将为所有实例创建一个对象,除非您明确指定范围为原型.您尚未发布弹簧配置.请发布,它会给出一个更好的主意.