您的位置:首页 > 编程语言 > Java开发

spring bean scope模式配置的一些思考

2015-08-19 11:27 197 查看
在练习使用spring+struts2的时候遇到一个问题,就是如何让每个用户拥有自己的session,

而且不同的用户之间互不干扰。

我首先想到是singleton和prototype这两个模式,

因为这也是经常见到的,但是在使用的时候遇到很多问题。

1.使用singleton模式的配置。

<bean id="user" class="com.user.userVo" scope="singleton" />

这样配置,在程序启动的时候spring只会实例化一个该bean,并id为user

两个用户A和B登陆系统,

A先登陆,user中的信息此时为A的信息;

B再登陆,user中的信息此时更新为B的信息。

那么问题来了,

等B登陆成功后,A刷新页面会产生什么样的结果呢?

很明显,如果此时A再次刷新页面,那么在A的页面上将会显示出B的信息。

当然,如果只有一个用户登陆,那无所谓,但是,哪个系统只有一个用户使用呢?

2.使用prototype模式的配置。

<bean id="user" class="com.user.userVo" scope="prototype"/>

这样配置,每次访问的时候都会初始化一个user,相当于每次使用的时候new了一个

bean对象。

这样配置在用A、B两个用户登陆的时候,他们都可以正常的登陆,而且不会发生错误,

因为A登陆的时候bean对象时userA,B登陆的时候bean对象成了userB,所以页面上显示的信息是正常的。

此时,或许你会想,这不就是你想要的结果么?

我也想这样就好了,但是程序的正确性不是祈祷就能解决的问题,现在没出现问题是你没有再次访问Action,

用户A再次刷新页面的时候,action又为A重新new了一个bean对象userA1,此时要么后台报错,要么页面空白,

因为userA中的A信息已经没有了,userA1中又是空的,你不停的访问,action就会不停的创建bean对象。

也许你想,不是有session么?将用户的信息放在session中不就会保存下来,当然前提是session还存在,

其实,刚开始我也是这样想的,我试着将A的信息放在session中,这回解决了上面的问题,

但是这样的话,问题又来了,现在只有一个bean,如果有多个bean,那么为了阻止A、B相互共享数据,

我们是不是要将更多的数据要么放在request,要么放在session中呢,

这样的放数据的话,肯定是没有说明问题的,毕竟这根使用servlet已经没什么区别了。

我不相信spring会没想到这些问题,

于是,我找了一些资料,后来发现其实在spring2之后就有了global、session、request这些配置了,

只是自己不知道,

这里有一个问题需要注意,就是在使用这些配置的时候必须在web.xml文件中先声明一下,

当然在使用singleton和prototype的时候我们是没有这样做的。

web.xml的版本是2.4以上的话,配置:

<listener>

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

</listener>

2.4以下的话,配置:

<filter>

<filter-name>requestContextFilter</filter-name>

<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>requestContextFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

配好这些的话,就可以根据你自己的需要再bean在配置:

<bean id="user" class="com.user.userVo" scope="session" />

或者

<bean id="user" class="com.user.userVo" scope="request" />

或者

<bean id="user" class="com.user.userVo" scope="global session" />

这样的话,我们就解决了以上的问题,

这个问题很简单,但是我们平时只是在别人搭建好的框架中填写代码,也许知道一些这些只是,但是不是很清楚,

经过这次的摸爬滚打我找到了这个问题的答案,特此记录纠结的过程,希望能帮到

跟我一样的问题的人。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: