SpringMVC线程安全问题

spring生成对象默认是单例(也就是一个对象)的。通过scope属性可以更改为多例。

 

<bean id="singleton" class="java.util.Date" scope="singleton"></bean>  <!--单例-->
<bean id="prototype" class="java.util.Date" scope="prototype"></bean>  <!--非单例-->

 

用过SpringMVC和Struts2  都知道, Struts2是线程安全 ,因为Struts2是基于类的拦截,每次处理一个请求都会实例一个

action对象,所有也就不存在线程安全的问题。

而SpringMVC是基于方法的拦截,SpringMVC的每一个controller默认为单例类,因此每一个request请求过来,系统会有原有的

instance去处理,这样不用每次都创建controller,减少了对象的创建,和垃圾回收的时间。

但是由于就创建一个controller的instance,当多线程调用它的时候,它 的instance便不再是线程安全的了。

因此应避免在controller中定义实例变量。

有几种解决方法:
1、在Controller中使用ThreadLocal变量
2、在spring配置文件Controller中声明 scope="prototype",每次都创建新的controller
所在在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的。


@Controller  
@RequestMapping("/fui")  
public class FuiController extends SpringController {  
//这么定义的话就是单例  
  
@Controller  
@Scope("prototype")  
@RequestMapping("/fui")  
public class FuiController extends SpringController {  
//每次都创建

转载于:https://my.oschina.net/u/2331760/blog/3066222

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值