Spring的默认作用域是单例。只是你对什么是单例的理解与Spring定义的不一样。
如果你告诉Spring使用不同的id创建两个相同类的bean,那么你会得到两个独立的bean,每个bean都有单例作用域。单例作用域意味着当你引用具有相同id的内容时,你会得到相同的bean实例。
这里是Spring文档如何定义单例作用域:
只有一个共享的单例bean实例被管理,所有请求具有与该bean定义匹配的id或ids的bean都会导致Spring容器返回该特定的bean实例。
单例作用域意味着使用相同的id检索相同的bean,仅此而已。测试没有两个id引用了相同的类将妨碍使用映射作为bean,并且会因通过BeanFactories代理事物而变得复杂。
Spring信任用户知道自己在做什么,而不是花费大量工作来监管这一点。
如果您想要一个bean的单例性质在多个名称之间保持不变,那是可以做到的。您可以使用
alias让多个名称引用同一个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实例。