Spring MVC Controller默认是单例的,为了提高性能(这个不用废话了,单例不用每次都new,当然快了。)如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。因此,只要controller中不定义属性,那么单例完全是安全的。下面给个例子说明下:

@Controller
public class MultViewController {
private static int st = 0; //静态的
private int index = 0; //非静态


@RequestMapping("/test")
public String test() {
System.out.println(st++ + " | " + index++);
return "/lsh/ch5/test";
}
}

默认单实例下,输出结果:

0 | 0

1 |  1

2 | 2

3 | 3

4 | 4

在类上添加@Scope("prototype"),改为多实例,输出结果:


0 | 0

1 |  0

2 | 0

3 | 0

4 | 0

那么,接下来的问题来了?在controller中注入service、在service中注入dao,dao中有数据的连接,如果默认使用的是单实例,那么会不会造成线程安全性问题?

答案肯定是不会的。因为spring使用了localthread技术。详情,请看下篇博客。