你能解释一下为什么Spring要为如下所示的bean配置创建两个对象吗,因为默认情况下spring的默认作用域是单例的?
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>
Spring的默认作用域is单例。只是你对单例的理解与 Spring 定义单例的方式不符。
如果你告诉Spring创建两个具有不同id和相同类的独立bean,那么你会得到两个独立的bean,每个bean都有单例范围。所有单例范围意味着当您引用具有相同 id 的内容时,您将获得相同的 bean 实例。
这是如何Spring 文档定义了单例范围:
仅管理单例 bean 的一个共享实例,并且对具有与该 bean 定义匹配的 id 或 id 的 bean 的所有请求都会导致 Spring 容器返回一个特定的 bean 实例。
单例范围意味着使用相同的 id 检索相同的 bean,仅此而已。测试没有两个 id 引用同一个类会妨碍将映射用作 bean,并且使用 BeanFactories 代理事物会变得复杂。
对于 Spring 来说,这将涉及大量工作而收效甚微。相反,它相信用户知道他们在做什么。
如果您希望在多个名称中保留 bean 的单例性,这是可行的。您可以让多个名称引用同一个 bean,这是通过使用alias:
在 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实例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)