记忆、淡忘

Spring-bean作用域scope详解

通过spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域,Spring支持五种作用域。

  • singleton :单例模式
    在整个Spring IoC容器中,使用singleton定义的bean只有一个实例。
  • prototype:原型模式
    每次通过getBean方法获取prototype定义的Bean时,都会产生一个Bean实例。
  • request
    在每次HTTP请求中,request定义的bean都会产生一个实例;即每次HTTP请求将会有各自的bean实,。该作用域仅在web应用中使用Spring情形下有效。
  • session
    在每次HTTP Session中,session定义的bean都会产生一个实例。即每次HTTP session 请求将会有各自的bean实例。该作用域仅在web应用中使用Spring情形下有效。
  • global session
    每个全局的HTTP Session中对应一个实例。典型情况下,仅在使用portlet context的时候有效。该作用域仅在web应用中使用Spring情形下有效。

1.Singleton作用域

当一个bean的作用域为singleton, 那么Spring IoC容器中只会存在一个共享的bean实例,每次请求该bean都会返回bean的同一实例。
换言之,当把一个bean定义设置为singlton作用域时,Spring IoC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例。

2.Prototype

Prototype作用域的bean会导致在每次请求该id的Bean时都会创建一个新的bean实例,然后返回给程序。这种情况下,spring容器仅仅使用new关键字创建Bean实例,一旦创建成功,容器不再维护Bean实例的状态。

3. 其他作用域

3.1. Request作用域

考虑下面bean定义:
针对每次HTTP请求,Spring容器会创建一个全新的bean实例,且该bean实例仅在当前HTTP request内有效,因此可以根据需要放心的更改所建实例的内部状态,而其他请求中获得的 bean实例不会看到这些特定于某个请求的状态变化。当处理请求结束,request作用域的bean实例将被销毁。

3.2. Session作用域

考虑下面bean定义:
Session作用域与request作用域一样,区别在于:request作用域的Bean对于每次HTTP请求有效,而session作用域的Bean则对应每次HTTP Session有效。

注:request、session作用域只在web应用中才有效,并且必须在web应用中增加相应配置才会生效。为了让request、session作用域生效,必须把HTTP请求对象绑定到为该请求提供服务的线程上,使得具有request和session作用域的Bean实例能够在后面的调用中被访问。

在web.xml文件增加listener配置

1
2
3
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>