SpringMVC线程安全问题

spring生成对象默认是单例(也就是一个对象)的。经过scope属性能够更改成多例。java

 

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

 

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

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

而SpringMVC是基于方法的拦截,SpringMVC的每个controller默认为单例类,所以每个request请求过来,系统会有原有的多线程

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

可是因为就建立一个controller的instance,当多线程调用它的时候,它 的instance便再也不是线程安全的了。ui

所以应避免在controller中定义实例变量。.net

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


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

相关文章
相关标签/搜索