所有的spring bean 默认都是单例。当容器分配一个bean时,它总是返回bean的同一个实例。但有时我们需要每次请求时都获得唯一的bean实例,那么如何覆盖spring默认的单例配置呢?
当在spring中配置<bean>时,我们可以为bean声明一个作用域。为了让spring在每次请求时都为bean产生一个新的实例,我们只需要配置bean的scope属性为prototype即可。例如,把演出门票声明为 spring bean:
<bean id="ticket" class="com.springaction.springidol.Ticket" scope="prototype"></bean>
spring 的bean作用域允许用户配置所创建的bean属于哪一种作用域,而无需再bean的实现里硬编码作用域规则。
作用域 定义
singleton 在每一个spring容器中,一个Bean定义只有一个对象实例(默认)
prototype 允许bean的定义可以被实例化任意次(每次调用都创建一个实例)
request 在一次http请求中,每个bean定义对应一个实例。该作用域仅在基于web的spring上下文中才有效。
session 在一个http session中,每个bean定义对应一个实例。该作用域仅在基于web的spring上下文中才有效。
global-session 在一个全局http session中,每个bean定义对应一个实例。该作用域仅在portlet上下文中才有效。
大多数情况下,我们只需要选择默认的singleton作用域即可,但是如果我们使用spring作为工厂来创建领域对象新实例时,prototype作用域就非常有用。
spring有关单例的概念限于spring上下文的范围内,不像真正的单例,在每个类加载器中保证只有一个实例。spring的单例bean只能保证在每个应用上下文中只有一个bean的实例。