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" />
这样的话,我们就解决了以上的问题,
这个问题很简单,但是我们平时只是在别人搭建好的框架中填写代码,也许知道一些这些只是,但是不是很清楚,
经过这次的摸爬滚打我找到了这个问题的答案,特此记录纠结的过程,希望能帮到
跟我一样的问题的人。
而且不同的用户之间互不干扰。
我首先想到是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
- spring bean scope模式配置的一些思考
- 【Spring】Spring常用配置-Bean的Scope
- Spring中Bean的scope配置
- Spring Bean的Scope
- spring bean的scope
- Spring Bean的Scope
- Spring Bean的scope
- spring bean的scope
- Spring配置<bean>时加scope="prototype"的原因
- 04-SpringBoot——Spring常用配置-Bean的Scope
- spring之bean的Scope
- spring中bean的scope
- Spring中Bean的Scope
- spring bean的scope属性
- spring bean的scope属性
- spring bean的scope属性
- spring中bean的scope
- Spring入门-----Bean的Scope
- 九度oj-1127-简单密码
- Android Studio常用快捷键
- json数据的处理
- vim 的一些常见命令收集
- memcached学习二
- spring bean scope模式配置的一些思考
- java 静态方法和实例方法的区别
- hdu 4517 floyd+记忆化搜索
- MyBatis中可以用以下的方式来传递多个参数
- 开发日记(7)如何让一个activity更新application中的数据,返回后更新呢?
- J2SE-beginning
- Actionbar&Toolbar 自定义Menu 布局--ActionProvider的使用
- Java线程面试题 Top 50
- 30天了解30种技术系列---(8)终于等到你:Node.js