spring mvc 是否要设置@Scope("prototype")

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容