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

教程大全  / 倒序浏览   ©

#楼主# 2020-2-14

跳转到指定楼层

马上注册,分享更多源码,享用更多功能,让你轻松玩转云大陆。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

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

分享淘帖
回复

使用道具

您的回复是对作者最大的奖励

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关于作者

木易549

新手猿

  • 主题

    7

  • 帖子

    7

  • 关注者

    0

Archiver|手机版|小黑屋|云大陆 | 赣ICP备18008958号-4|网站地图
Powered by vrarz.com!  © 2019-2020版权所有云大陆