知识大全 详解Spring中bean的scope
Posted 知
篇首语:恢弘志士之气,不宜妄自菲薄。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 详解Spring中bean的scope相关的知识,希望对你有一定的参考价值。
详解Spring中bean的scope 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
如何使用spring的作用域
<bean id= role class= spring chapter maryGame Role scope= singleton />
这里的scope就是用来配置spring bean的作用域 它标识bean的作用域 在spring 之前bean只有 种作用域即 singleton(单例) non singleton(也称prototype) Spring 以后 增加了session request global session三种专用于Web应用程序上下文的Bean 因此 默认情况下Spring 现在有五种类型的Bean 当然 Spring 对Bean的类型的设计进行了重构 并设计出灵活的Bean类型支持 理论上可以有无数多种类型的Bean 用户可以根据自己的需要 增加新的Bean类型 满足实际应用需求
singleton作用域
当一个bean的作用域设置为singleton 那么Spring IOC容器中只会存在一个共享的bean实例 并且所有对bean的请求 只要id与该bean定义相匹配 则只会返回bean的同一实例 换言之 当把一个bean定义设置为singleton作用域时 Spring IOC容器只会创建该bean定义的唯一实例 这个单一实例会被存储到单例缓存(singleton cache)中 并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例 这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的 单例设计模式表示一个ClassLoader中只有一个class存在 而这里的singleton则表示一个容器对应一个bean 也就是说当一个bean被标识为singleton时候 spring的IOC容器中只会存在一个该bean
配置实例
<bean id= role class= spring chapter maryGame Role scope= singleton />
或者
<bean id= role class= spring chapter maryGame Role singleton= true />
prototype
prototype作用域部署的bean 每一次请求(将其注入到另一个bean中 或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例 相当与一个new的操作 对于prototype作用域的bean 有一点非常重要 那就是Spring不能对一个prototype bean的整个生命周期负责 容器在初始化 配置 装饰或者是装配完一个prototype实例后 将它交给客户端 随后就对该prototype实例不闻不问了 不管何种作用域 容器都会调用所有对象的初始化生命周期回调方法 而对prototype而言 任何配置好的析构生命周期回调方法都将不会被调用 清除prototype作用域的对象并释放任何prototype bean所持有的昂贵资源 都是客户端代码的职责 (让Spring容器释放被singleton作用域bean占用资源的一种可行方式是 通过使用bean的后置处理器 该处理器持有要被清除的bean的引用 )
配置实例
<bean id= role class= spring chapter maryGame Role scope= prototype />
或者
<beanid= role class= spring chapter maryGame Role singleton= false />
request
request表示该针对每一次HTTP请求都会产生一个新的bean 同时该bean仅在当前HTTP request内有效 配置实例 request session global session使用的时候首先要在初始化web的web xml中做如下配置 如果你使用的是Servlet 及以上的web容器 那么你仅需要在web应用的XML声明文件web xml中增加下述ContextListener即可
<web app>
<listener>
<listener class> sprntext request RequestContextListener</listener class>
</listener>
</web app>
如果是Servlet 以前的web容器 那么你要使用一个javax servlet Filter的实现
<web app>
<filter>
<filter name>requestContextFilter</filter name>
<filter class> springframework web filter RequestContextFilter</filter class>
</filter>
<filter mapping>
<filter name>requestContextFilter</filter name>
<url pattern>/*</url pattern>
</filter mapping>
</web app>
接着既可以配置bean的作用域了
<bean id= role class= spring chapter maryGame Role scope= request />
session
session作用域表示该针对每一次HTTP请求都会产生一个新的bean 同时该bean仅在当前HTTP session内有效 配置实例
配置实例 和request配置实例的前提一样 配置好web启动文件就可以如下配置
<bean id= role class= spring chapter maryGame Role scope= session />
global session
global session作用域类似于标准的HTTP Session作用域 不过它仅仅在基于portlet的web应用中才有意义 Portlet规范定义了全局Session的概念 它被所有构成某个portlet web应用的各种不同的portlet所共享 在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内 如果你在web中使用global session作用域来标识bean 那么web会自动当成session类型来使用 配置实例 和request配置实例的前提一样 配置好web启动文件就可以如下配置
<bean id= role class= spring chapter maryGame Role scope= global session />
自定义bean装配作用域在spring 中作用域是可以任意扩展的 你可以自定义作用域 甚至你也可以重新定义已有的作用域(但是你不能覆蓋singleton和prototype) spring的作用域由接口 springframewonfig Scope来定义 自定义自己的作用域只要实现该接口即可 下面给个实例 我们建立一个线程的scope 该scope在表示一个线程中有效 代码如下
publicclass MyScope implements Scope
privatefinal ThreadLocal threadScope = new ThreadLocal()
protected Object initialValue()
returnnew HashMap();
;
public Object get(String name ObjectFactory objectFactory)
Map scope = (Map) threadScope get();
Object object = scope get(name);
if(object==null)
object = objectFactory getObject();
scope put(name object);
return object;
public Object remove(String name)
Map scope = (Map) threadScope get();
return scope remove(name);
publicvoid registerDestructionCallback(String name Runnable callback)
public String getConversationId()
// TODO Auto generated method stub
returnnull;
cha138/Article/program/Java/hx/201311/26260
相关参考
Spring中bean的基本xml配置 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在spri
Java中如何获取Spring中配置的bean 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一
知识大全 解析Java中如何获取Spring中配置的bean
解析Java中如何获取Spring中配置的bean 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!本
知识大全 Spring强制向servlet中注入bean的方法
Spring强制向servlet中注入bean的方法 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
在spring中提供了三种可供选择的注入方式 提供set/get方法 构造函数 工厂方法的运用 大家对这三种方法的选择都是仁者见仁智者见智一下我是我支构造函数的理由 保证一些重要的属性在
读取xml文件 /** *利用XmlBeanFactory(Resourceresource) *这里Resource必须是xml格式 *Resource包括AbstractResourc
知识大全 使用SpringtUtil获取Spring IoC容器中的Bean
使用SpringtUtil获取SpringIoC容器中的Bean 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起
Spring创建Bean的过程 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! beans包提供了
Spring容器对Bean组件的管理 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 一Bean对
Spring获取Bean的几种方式 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 方法一在初始化