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 {
//每次都建立线程