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 {  
//每次都创建  
 

 

展开阅读全文

没有更多推荐了,返回首页