Java工程师的咖啡

spring mvc 是否要设置@Scope("prototyp

2020-02-14  本文已影响0人  anjian8000

在看单例模式的时候,不经意看到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")

上一篇 下一篇

猜你喜欢

热点阅读