spring配置文件中配置Action中的scope

【英文示意】
scope单词的意思为(处理、研究事务的)范围;眼界,见识;(活动或能力的)余地;广袤,地域,在计算机世界中也就是界或域的意思。
prototype单词的意识为原型,雏形,蓝本
singleton一个,独身,单独;

【概念介绍】

1.scope

scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在对象进入相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象。

比如把公司当成一个容器,保洁部的阿姨们作为一个类,那么当公司这个容器初始化这个类之后,那么阿姨们只能局限在保洁部这个场景中,在这里保洁部就可以看做保洁部阿姨的scope。当这些阿姨不在处于保洁部这个scope的限定时,那么公司这个容器就没有这些阿姨存在了。


2.prototype

scope为prototype类型的bean,容器在接受到该类型的对象的请求的时候,会每次都重新生成一个新的对象给请求方,虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回给请求方之后,容器就不在拥有当前对象的引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。也就是说,容器每次返回请求方该对象的一个新的实例之后,就由这个对象“自生自灭”了。

如果将购物袋的bean的scope属性声明为prototype,当我们去买东西时,每个顾客在去结账时,收银员都要给每个顾客一个新的购物袋,而至于顾客拿这个购物袋装什么东西或者扔垃圾桶,都不在属于收银员管理的范畴内。


2.singleton

scope为singleton类型的bean定义,在一个容器中只存在一个实例,所有对该类型bean的依赖都引用这一单一实例。此外,singleton类型的bean定义,从容器启动,到他第一次被请求而实例化开始,只要容器不销毁或退出,该类型的bean的单一实例就会一直存活。spring中配置action的bean并没有配置scope,默认情况下为singleton。
如果一个超市为一个容器,那么所有顾客都要从超市的进口进入超市中,那么对于超市这个容器,超市进入口就是一个singleton类型的bean,只要超市不关门,它就一直存在。



【总结】

spring 默认scope 是单例模式也就是singleton,这样只会创建一个Action对象。而struts2的Action不是线程安全的,每次访问都是同一个Action对象,数据不安全,所以要求在多线程环境下必须是一个线程对应一个独立的实例,使得struts2 每次次访问都对应不同的Action,所以 scope="prototype" 可以保证当有请求的时候,都创建一个Action对象。

在Spring中应该为action的bean配置scope为prototype,即scope=”prototype”或注解形式@Scope(“prototype”)

如:
	<bean id="userAction" class="shop.user.action.UserAction" scope="prototype">


【扩展】

在Spring 2.0之后,为支持web应用的ApplicationContext,推出另外三种:request,session和global session类型。他们只适用于web程序,通常是和XmlWebApplicationContext共同使用
1 request:
<bean id ="requestPrecessor" class="...RequestPrecessor" scope="request" />

Spring容器,即XmlWebApplicationContext 会为每个HTTP请求创建一个全新的RequestPrecessor对象,当请求结束后,,该对象的生命周期即告结束。当同时有10个HTTP请求进来的时候,容器会分别针对这10个请求创建10个全新的RequestPrecessor实例,且他们相互之间互不干扰,从不是很严格的意义上说,request可以看做prototype的一种特例,除了场景更加具体之外,语意上差不多。


2 session:
对于web应用来说,放到session中最普遍的就是用户的登录信息,对于这种放到session中的信息,我们可以使用如下形式的制定scope为session:
<bean id ="userPreferences" class="...UserPreferences" scope="session" />

Spring容器会为每个独立的session创建属于自己的全新的UserPreferences实例,他比request scope的bean会存活更长的时间,其他的方面真是没什么区别。


3 global session:
<bean id ="userPreferences" class="...UserPreferences" scope="globalsession" />
global session只有应用在基于porlet的web应用程序中才有意义,他映射到porlet的global范围的session,如果普通的servlet的web 应用中使用了这个scope,容器会把它作为普通的session的scope对待。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值