Spring中scope属性singleton和prototype使用的区别

来源:互联网 发布:网络直播培训 编辑:程序博客网 时间:2024/06/10 22:03

在做关于SSM框架整合的报告时,突然想到了这个问题,当时凭着记忆给大家介绍了一下,singleton是单例的模式,在spring中默认是singleton的,也就是在spring 容器中只有一个bean对象,所有的请求都有这个bean来处理,prototype是多例的模式,声明了prototype后,spring容器,会为每一个请求创建一个bean对象,也就是说容器中会有很多bean对象。

下面是报告结束后,在网上查找到的准确的答案,感谢作者:http://www.juziku.com/zhouchao/wiki/4036.htm Maybe不是原作~哈,我又在你的基础上加了一些自己的思考:

bean里面的scope 是用来配置 spring bean 的作用域的,它标识 bean 的作用域。在spring2.0之前,只有两种形式的作用域:即singleton和prototype(non-singleton);而在spring2.0以后,又增加了3个专门用于web应用程序的上下文作用域:session,request,global session.

1.singleton.当作用域被设置为singleton时,spring IOC容器中就只存在一个共享的bean实例,并且只要是bean请求,当查找到的id或name匹配时,就会将这个共享实例返回。这个单例被存储到单例缓存(singleton cache)中,并且所有针对该bean的请求和引用都会返回缓存的这个实例对象,也就造成了不安全性。

2.prototype.当作用域被设置为prototype时,spring IOC容器,根据每一次请求都会产生一个新的bean实例,请求的内容包括一:直接调用容器的getbean();二:被注入到另一个bean中。有一点需要注意的是:spring文档中指出:清除 prototype作用域的对象 并释放 任何prototype bean所持有的昂贵资源,都是客户端代码的职责。这里的客户端代码是针对spring框架而言的,指的是使用了spring框架开发应用的程序员写的代码。具体的来说,清除 prototype作用域的对象的工作是有JVM帮我们完成的,比如当前应用程序的运行超出了bean的作用域。而释放 任何prototype bean所持有的昂贵资源 的工作是要程序员手动完成的,比如我们使用了文件流后要close文件流,使用了连接后要关闭连接。

request、session、global session使用的时候首先要在初始化web的web.xml中做如下配置:
对于Servlet 2.3.4及以上的web容器,那么你仅需要在web应用的XML声明文件web.xml中增加下述ContextListener即可: 
1<web-app>
2   ...
3  <listener>
4<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
5  </listener>
6   ...
7</web-app>
如果是Servlet2.3.4以前的web容器,那么要使用一个javax.servlet.Filter的实现: 
01<web-app>
02 ..
03 <filter>
04    <filter-name>requestContextFilter</filter-name>
05    <filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
06 </filter>
07 <filter-mapping>
08    <filter-name>requestContextFilter</filter-name>
09    <url-pattern>/*</url-pattern>
10 </filter-mapping>
11   ...
12</web-app>

view source
print?
3.request.当作用域被设置为request时,spring会针对每一个http请求产生一个bean,并且这个bean只在当前的request中有效。
<bean id="role" class="xxx"scope="request"/>
4.session.当作用域被设置为session时,spring会针对每一个http请求产生一个bean,并且这个bean只在当前的session中有效。
<bean id="role" class="xxx"scope="session"/>
5.global session.global session作用域类似于标准的HTTP Session作用域,不过它仅仅在基于portlet(一款java的web组件)的web应用中才有意义。Portlet规范定义了全局Session的概念,它被所有构成某个 portlet web应用的各种不同的portlet所共享。在global session作用域中定义的bean被限定于全局portlet Session的生命周期范围内。如果你在web中使用global session作用域来标识bean,那么web会自动当成session类型来使用。
<bean id="role" class="xxx"scope="global session"/>

实际开发中还是接触前两种比较多,但是其他几个原理还是要知道的啦~