加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

java – 在SpringMVC控制器层,@ Siece(“prototype”)vs @Scope

发布时间:2020-12-15 01:41:40 所属栏目:大数据 来源:网络整理
导读:我有使用SpringMVC的以下Controller代码: @Controller@Scope("prototype")@RequestMapping("/messages")public class MessageController { @RequestMapping(value="/index",method=RequestMethod.GET) @ResponseStatus(HttpStatus.OK) @ResponseBody public

我有使用SpringMVC的以下Controller代码:

@Controller
@Scope("prototype")
@RequestMapping("/messages")
public class MessageController {
    @RequestMapping(value="/index",method=RequestMethod.GET)
    @ResponseStatus(HttpStatus.OK)
    @ResponseBody
    public String displayAllMessages(ModelMap model) {
        System.out.println(this.hashCode());
        // processing
        return "messages";
    }
}

当使用@Scope(“prototype”)时,每个请求都会出现,this.hashCode()的输出是不同的,这意味着当每个请求到来时,将创建一个新的MessageController实例.

如果不使用@Scope(“prototype”),默认将是@Scope(“singleton”),每个请求都来了,this.hashCode()的输出是相同的,这意味着只创建了一个MessageController实例.

我不确定什么时候应该使用@Scope(“原型”),什么时候不能?

最佳答案
假设您像猪一样编码并在控制器中执行类似的操作:

private List

您的控制器将变为有状态:它具有无法在两个请求之间共享的状态(allMessages).控制器不再是线程安全的.如果同时调用它来处理两个并发请求,则可能存在竞争条件.

您可以通过使控制器成为原型来避免此问题:每个请求将由单独的控制器处理.

或者你可以做正确的事情并使代码无状态,在这种情况下,为每个请求创建一个新的控制器将是无用的,因为控制器将是无状态的,因此线程安全.然后范围可以保持其默认值:singleton.

public String displayAllMessages(ModelMap model) {
    List

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读