Spring中bean的五个作用域简介(转载)
Spring上个版本的IoC容器支持两个不同的bean作用域(单例与原型)。
Spring 2.0改进了这一点,不仅提供了一些依赖于Spring部署环境(比如说,在web环境中的request和session作用域bean)的额外的作用域,而且提供了所谓的'钩子'('hooks')(因为找不到更好的表达)使Spring用户可以创造自己的作用域。
应该注意的是,即使单例与原型作用域beans的基本(内在)实现发生了变化,上述变化对最终用户来说是透明的...现有的配置不需要改变或放弃。
如何使用spring的作用域:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/> |
下面分别对spring 中的作用域分别介绍一下:
1、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.chapter2.maryGame.Role" scope="singleton"/> |
或者
<bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/> |
2、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.chapter2.maryGame.Role" scope="prototype"/> |
或者
<beanid="role" class="spring.chapter2.maryGame.Role" singleton="false"/> |
3、request
request表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP request内有效,配置实例:
request、session、global session使用的时候,首先要在初始化web的web.xml中做如下配置:
如果你使用的是Servlet 2.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可:
<web-app> ... <listener> <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> </listener> ... </web-app> |
如果是Servlet2.4以前的web容器,那么你要使用一个javax.servlet.Filter的实现:
<web-app> .. <filter> <filter-name>requestContextFilter</filter-name> <filter-class>org.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.chapter2.maryGame.Role" scope="request"/> |
4、session
session作用域表示该针对每一次HTTP请求都会产生一个新的bean,同时该bean仅在当前HTTP session内有效,配置实例:
配置实例:
和request配置实例的前提一样,配置好web启动文件就可以如下配置:
<bean id="role" class="spring.chapter2.maryGame.Role" scope="session"/> |
5、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.chapter2.maryGame.Role" scope="global session"/> |
6、自定义bean装配作用域
在spring 2.0中作用域是可以任意扩展的,你可以自定义作用域,甚至你也可以重新定义已有的作用域(但是你不能覆盖singleton和prototype),spring的作用域由接口org.springframework.beans.factory.config.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; } } |
转载于:https://www.cnblogs.com/zhouxiansheng/p/3954707.html
Spring中bean的五个作用域简介(转载)相关推荐
- spring中bean的5个作用域
bean的5个作用域主要有:singleton,prototype,request,session,global session. Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实 ...
- 厉害了,Spring中bean的12种定义方法!
前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...
- Spring 中 Bean 的生命周期
本文作者: 伯乐在线 - yemengying 智商捉鸡?,实在没办法一下子理解Spring IoC和AOP的实现原理,看的闹心也不太懂,所以...决定拆成小的不能在小的一个个问题,一点点啃.今天先来 ...
- 面试问题:Spring中Bean 的生命周期
Spring Bean生命周期执行流程 在传统的 Java 应用中,Bean 的生命周期很简单,使用关键字 new 实例化 Bean,当不需要该 Bean 时,由 Java 自动进行垃圾回收. Spr ...
- spring中bean属性scope
spring中bean属性scope singleton:SpringIoc容器只会创建该Bean的唯一实例,所有的请求和引用都只使用这个实例 Property: 每次请求都创建一个实例 reques ...
- spring中Bean的作用范围
Spring中Bean的作用范围 Singleton:使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例. singleton是默认的作用域,当定义B ...
- (十)Spring中Bean的生命周期(下)
Spring官网阅读(十)Spring中Bean的生命周期(下) 在上篇文章中,我们已经对Bean的生命周期做了简单的介绍,主要介绍了整个生命周期中的初始化阶段以及基于容器启动停止时LifeCycle ...
- Spring框架——Bean的Scope(作用域)易错陷阱解析
Spring框架--Bean的Scope(作用域)易错陷阱解析 阅读先修: 阅读本篇博文之前,您必须熟悉基本的有关Spring框架核心的IOC容器相关知识,以及基本的Bean配置方式.如若对该部分知识 ...
- Spring中Bean初始化和销毁的多种方式
Spring中Bean初始化和销毁的多种方式 一.Bean的多种初始化方式 1.PostConstruct注解 2.实现InitializingBean接口 3.声明init-method方法 二.B ...
最新文章
- 学习 慕课网 PHP工程师学习计划--我的笔记汇总
- Linux系统运维工程师PDF文档精选
- 嵌入式入门要知道的五个小窍门-心得
- 互联网晚报 | 3月24日 星期四 |​ ​国务院安委办:立即开展民航安全隐患排查;​新东方新公司经营范围含电竞赛事策划...
- Windows/Linux服务器上Tomcat开启远程调试,使用IDEA本地调试
- 重定位----操作系统做的事情
- 我们常常怕打扰别人,而忽略要打个电话问候对方,
- 计算机图形学常用知识点,计算机图形学基础重点
- 清除Chrome的缓存、Cookie
- ubuntu中耳机声音小的解决方案
- Java app接入微信和支付宝支付
- 计算机网络:自顶向下方法 笔记
- iOS Wow体验 - 第四章 - 为应用的上下文环境而设计
- springboot解决循环依赖问题
- STM8自学入门方向
- OGNL表达式的入门
- 浏览器访问虚拟机elasticsearch失败
- 2.2案例:鸢尾花分类——逻辑回归
- 熊猫直播被传破产:王思聪也救不了 员工发文告别
- rust怎么调整夜晚亮度_摄影:手机怎么拍夜景?学会这4个拍摄技巧会很有帮助...
热门文章
- 我的世界服务器防挂系统,[管理|机制]AFKKicker —— 防挂机!定时要求输入验证码 防止挂机[1.7.10-1.12.2]...
- 交通灯程序设计C语言,基于MCS-51的交通灯程序设计(c语言控制直行左转,包含程序)...
- canal mysql5.6_超详细的Canal入门,看这篇就够了!
- xy坐标正负方向_【笛卡尔坐标系】
- Java 删除集合中指定的元素
- Java 获取目录的大小
- C语言指针变量的定义和使用
- android 图片传递,如何使用包在Android活动之间传递图像(位图)?
- 阶段项目:学生信息管理系统数据库设计
- 执行计划 分析一条sql语句的效率 mysql_mysql的SQL语句执行计划分析:EXPLAIN