在做关于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即可:
4 | < listener-class >org.springframework.web.context.request.RequestContextListener</ listener-class > |
如果是Servlet2.3.4以前的web容器,那么要使用一个javax.servlet.Filter的实现:
04 | < filter-name >requestContextFilter</ filter-name > |
05 | < filter-class >org.springframework.web.filter.RequestContextFilter</ filter-class > |
08 | < filter-name >requestContextFilter</ filter-name > |
09 | < url-pattern >/*</ url-pattern > |
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"
/>
实际开发中还是接触前两种比较多,但是其他几个原理还是要知道的啦~