知识大全 详解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配置

Spring中bean的基本xml配置  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在spri

知识大全 Java中如何获取Spring中配置的bean

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中bean的注入方式的选择

  在spring中提供了三种可供选择的注入方式  提供set/get方法  构造函数  工厂方法的运用  大家对这三种方法的选择都是仁者见仁智者见智一下我是我支构造函数的理由  保证一些重要的属性在

知识大全 spring中读取xml配置文件、获取bean

  读取xml文件  /**  *利用XmlBeanFactory(Resourceresource)  *这里Resource必须是xml格式  *Resource包括AbstractResourc

知识大全 使用SpringtUtil获取Spring IoC容器中的Bean

使用SpringtUtil获取SpringIoC容器中的Bean  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起

知识大全 Spring创建Bean的过程

Spring创建Bean的过程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  beans包提供了

知识大全 Spring容器对Bean组件的管理

Spring容器对Bean组件的管理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一Bean对

知识大全 Spring获取Bean的几种方式

Spring获取Bean的几种方式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  方法一在初始化