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的五个作用域简介(转载)相关推荐

  1. spring中bean的5个作用域

    bean的5个作用域主要有:singleton,prototype,request,session,global session. Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实 ...

  2. 厉害了,Spring中bean的12种定义方法!

    前言 在庞大的java体系中,spring有着举足轻重的地位,它给每位开发者带来了极大的便利和惊喜.我们都知道spring是创建和管理bean的工厂,它提供了多种定义bean的方式,能够满足我们日常工 ...

  3. Spring 中 Bean 的生命周期

    本文作者: 伯乐在线 - yemengying 智商捉鸡?,实在没办法一下子理解Spring IoC和AOP的实现原理,看的闹心也不太懂,所以...决定拆成小的不能在小的一个个问题,一点点啃.今天先来 ...

  4. 面试问题:Spring中Bean 的生命周期

    Spring Bean生命周期执行流程 在传统的 Java 应用中,Bean 的生命周期很简单,使用关键字 new 实例化 Bean,当不需要该 Bean 时,由 Java 自动进行垃圾回收. Spr ...

  5. spring中bean属性scope

    spring中bean属性scope singleton:SpringIoc容器只会创建该Bean的唯一实例,所有的请求和引用都只使用这个实例 Property: 每次请求都创建一个实例 reques ...

  6. spring中Bean的作用范围

    Spring中Bean的作用范围 Singleton:使用该属性定义Bean时,IOC容器仅创建一个Bean实例,IOC容器每次返回的是同一个Bean实例. singleton是默认的作用域,当定义B ...

  7. (十)Spring中Bean的生命周期(下)

    Spring官网阅读(十)Spring中Bean的生命周期(下) 在上篇文章中,我们已经对Bean的生命周期做了简单的介绍,主要介绍了整个生命周期中的初始化阶段以及基于容器启动停止时LifeCycle ...

  8. Spring框架——Bean的Scope(作用域)易错陷阱解析

    Spring框架--Bean的Scope(作用域)易错陷阱解析 阅读先修: 阅读本篇博文之前,您必须熟悉基本的有关Spring框架核心的IOC容器相关知识,以及基本的Bean配置方式.如若对该部分知识 ...

  9. Spring中Bean初始化和销毁的多种方式

    Spring中Bean初始化和销毁的多种方式 一.Bean的多种初始化方式 1.PostConstruct注解 2.实现InitializingBean接口 3.声明init-method方法 二.B ...

最新文章

  1. 学习 慕课网 PHP工程师学习计划--我的笔记汇总
  2. Linux系统运维工程师PDF文档精选
  3. 嵌入式入门要知道的五个小窍门-心得
  4. 互联网晚报 | 3月24日 星期四 |​ ​国务院安委办:立即开展民航安全隐患排查;​新东方新公司经营范围含电竞赛事策划...
  5. Windows/Linux服务器上Tomcat开启远程调试,使用IDEA本地调试
  6. 重定位----操作系统做的事情
  7. 我们常常怕打扰别人,而忽略要打个电话问候对方,
  8. 计算机图形学常用知识点,计算机图形学基础重点
  9. 清除Chrome的缓存、Cookie
  10. ubuntu中耳机声音小的解决方案
  11. Java app接入微信和支付宝支付
  12. 计算机网络:自顶向下方法 笔记
  13. iOS Wow体验 - 第四章 - 为应用的上下文环境而设计
  14. springboot解决循环依赖问题
  15. STM8自学入门方向
  16. OGNL表达式的入门
  17. 浏览器访问虚拟机elasticsearch失败
  18. 2.2案例:鸢尾花分类——逻辑回归
  19. 熊猫直播被传破产:王思聪也救不了 员工发文告别
  20. rust怎么调整夜晚亮度_摄影:手机怎么拍夜景?学会这4个拍摄技巧会很有帮助...

热门文章

  1. 我的世界服务器防挂系统,[管理|机制]AFKKicker —— 防挂机!定时要求输入验证码 防止挂机[1.7.10-1.12.2]...
  2. 交通灯程序设计C语言,基于MCS-51的交通灯程序设计(c语言控制直行左转,包含程序)...
  3. canal mysql5.6_超详细的Canal入门,看这篇就够了!
  4. xy坐标正负方向_【笛卡尔坐标系】
  5. Java 删除集合中指定的元素
  6. Java 获取目录的大小
  7. C语言指针变量的定义和使用
  8. android 图片传递,如何使用包在Android活动之间传递图像(位图)?
  9. 阶段项目:学生信息管理系统数据库设计
  10. 执行计划 分析一条sql语句的效率 mysql_mysql的SQL语句执行计划分析:EXPLAIN