Spring定义了多种作用域
- 单例(Singleton):在整个应用中,只创建bean的一个实例
- 原型(Prototype):每次注入或者通过Spring应用上下文获取的时候,都会创建一个新的bean的实例
- 会话(Session):在WEB应用中,为每个会话创建一个bean实例
- 请求(Request):在WEB应用中,为每个请求创建一个bean实例
单例是默认的作用域。选择其他作用域要使用@Scope
注解。
声明为原型bean:
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
OR
<bean id="beanDemo" class="..." scope="prototype">
</bean>
使用会话和请求作用域
如用户和其购物车bean,购物车bean跟用户的关联性很大,适合使用会话作用域。
@Scope(value = WebApplicationContext.SCOPE_SESSION,
proxyMode = ScopedProxyMode.INTERFACES)
OR
<bean id="beanDemo" class="..." scope="session">
<aop:scoped-proxy proxy-target-class="false" />
</bean>
scoped-proxy
和 proxyMode
功能类似,就是在还没有用户访问的时候(无法注入会话bean实例),会注入会话bean的一个代理。
ScopedProxyMode.INTERFACES
和 proxy-target-class="false"
表明采用基于接口的代理。
请求bean会面临上面同样的装配问题。
以上内容参考自:《Spring Action》第四版