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