在看单例模式的时候,不经意看到prototype和single在springmvc中的使用,记录一下。
springMVC Controller默认是单例的:
单例的原因有二:
1、为了性能。
2、不需要多例。
我这里说不需要的原因是看开发者怎么用了,如果你给controller中定义很多的属性,那么单例肯定会出现竞争访问了。
因此,只要controller中不定义属性,那么单例完全是安全的。下面给个例子说明下:
@RestController
@RequestMapping("/api/")
@Scope("prototype")
@Slf4j
public class TestController {
private static int sts = 0;
private int index = 0;
@RequestMapping("/company")
public String getMessage(@RequestBody JSONObject jsonObject) {
System.out.println("==" + (sts++) + "," + (index++));
}
}
如果增加@Scope("prototype"),输出结果为:
==0,0
==1,0
==2,0
如果将@Scope("prototype")去掉/或者@Scope("singleton"),默认使用单例模式,输出结果为:
==0,0
==1,1
==2,2
从此可见,单例是不安全的,会导致定义成员变量index数据错误。
最佳实践:
1、不要在controller中定义成员变量。
2、万一必须要定义一个非静态成员变量时候,则通过注解@Scope("prototype"),将其设置为多例模式。
只要不定义一个成员变量就行了。就可以不用@Scope("prototype")