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

来源:互联网 发布:安卓录屏内录声音软件 编辑:程序博客网 时间:2024/06/05 16:10
在练习使用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" />
这样的话,我们就解决了以上的问题,
这个问题很简单,但是我们平时只是在别人搭建好的框架中填写代码,也许知道一些这些只是,但是不是很清楚,
经过这次的摸爬滚打我找到了这个问题的答案,特此记录纠结的过程,希望能帮到
跟我一样的问题的人。
0 0
原创粉丝点击