spring中bean的作用域

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/

posted on 2016-06-23 10:44  javaABCD  阅读(9596)  评论(0编辑  收藏  举报