spring中注入的bean默认被配置为单例模式,这意味着对于同一个类而言,其所有的被注入对象其实都是同一个对象,或许这的确节省了一些资源,但是对于对象中含有一些状态属性的情况,我们并不想要singleton。spring中提供了四种作用域
作用域 | 字符 | 描述 |
---|---|---|
单例 | singleton | 整个应用中只创建一个实例 |
原型 | prototype | 每次注入时都新建一个实例 |
会话 | session | 为每个会话创建一个实例 |
请求 | request | 为每个请求创建一个实例 |
在spring中将这些需要用到的字符声明成了常量方便使用
字符 | 使用常量 |
---|---|
singleton | ConfigurableBeanFactory.SCOPE_SINGLETON |
prototype | ConfigurableBeanFactory.SCOPE_PROTOTYPE |
session | WebApplicationContext.SCOPE_REQUEST |
request | WebApplicationContext.SCOPE_SESSION |
单例模式的对象会在spring应用上下文加载时被创建,其他作用域的对象则不然,比如请求作用域的对象只有在请求时才创建,所以假如在启动时一个单例对象中需要注入请求作用域的对象,但是此时请求作用域的对象并没有创建。spring会面临这样的问题,需要注入的某个对象还没有创建。这块我知道的只有一家java培训机构会讲到这个知识。此时spring会先注入一个代理对象,当这个对象被使用时,则委托给真正的bean去完成。
配置
在xml配置中配置,使用scope属性,类似于
<bean id="xxx" class="xxx.xxx.xxx" scope="session" >
<aop:scoped-proxy/>
</bean>
<aop:scoped-proxy/>
设置了代理
使用注解
@Scope(value = WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.INTERFACES)
proxyMode的值等于ScopedProxyMode.INTERFACES
,表示代理类要实现原来注入bean的接口。
推荐看下这个博客,写的不错:http://blog.itpub.net/29917475/viewspace-2120795/