springboot controller单例与多例问题验证

在项目中遇到两次请求并发,造成第一次请求通讯中断的问题,所以对这个问题进行了一些验证,本文为自己记录,不喜勿喷。

springboot 默认单例,多例增加@Scope("prototype")

1、单例与多例controller的验证

1)单例模式下

package com.chs.nginxdemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class BankController {
    private int index;
    private static int staicIndex;

    @RequestMapping("/query")
    @ResponseBody
    public String queryBank() {
        System.out.println("普通属性:" + index++ + "..." + "静态属性:" + staicIndex++);
        return "ok";
    }
}

打印输出如下:

普通属性:0...静态属性:0
普通属性:1...静态属性:1
普通属性:2...静态属性:2
普通属性:3...静态属性:3
普通属性:4...静态属性:4

我们可以看出非静态成员变量是共用的,一直在递增;静态成员也在递增。

2)多例模式

package com.chs.nginxdemo.controller;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@Scope("prototype")
public class BankController {
    private int index;
    private static int staicIndex;

    @RequestMapping("/query")
    @ResponseBody
    public String queryBank() {
        System.out.println("普通属性:" + index++ + "..." + "静态属性:" + staicIndex++);
        return "ok";
    }
}

普通属性:0...静态属性:0
普通属性:0...静态属性:1
普通属性:0...静态属性:2
普通属性:0...静态属性:3
普通属性:0...静态属性:4

我们看到非静态成员变量每次是创建,都是0;静态成员变量每次递增;

由此看出一般不要在单例模式下使用非静态成员变量。

2、如果controller继承的基类是多例,那么controller也是多例吗?

 

package com.chs.nginxdemo.controller;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

@Controller
@Scope("prototype")
public class BaseController {

}
package com.chs.nginxdemo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class BankController extends BaseController{
    private int index;
    private static int staicIndex;

    @RequestMapping("/query")
    @ResponseBody
    public String queryBank() {
        System.out.println("普通属性:" + index++ + "..." + "静态属性:" + staicIndex++);
        return "ok";
    }
}

打印输出如下:

普通属性:0...静态属性:0
普通属性:1...静态属性:1
普通属性:2...静态属性:2
普通属性:3...静态属性:3
普通属性:4...静态属性:4

由此看出此基类多例,子类单例,仍然是单例,不会继承;

3、如果controller是多例, service 是单例会创建多个service吗?

 

package com.chs.nginxdemo.controller;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

@Controller
@Scope("prototype")
public class BaseController {

}
package com.chs.nginxdemo.controller;

import com.chs.nginxdemo.service.SocketClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@Scope("prototype")
public class BankController extends BaseController {
    private int index;
    private static int staicIndex;
    @Autowired
    private SocketClient socketClient;

    @RequestMapping("/query")
    @ResponseBody
    public String queryBank() {
        String data = socketClient.doTrade();
        System.out.println("普通属性:" + index++ + "..." + "静态属性:" + staicIndex++ + "..." + "data:" + data);
        return "ok";
    }
}
package com.chs.nginxdemo.service;

import org.springframework.stereotype.Service;

@Service
public class SocketClient {
    private int index;

    public String doTrade() {
        return Integer.toString(index++);
    }

}

打印输出:

普通属性:0...静态属性:0...data:0
普通属性:0...静态属性:1...data:1
普通属性:0...静态属性:2...data:2
普通属性:0...静态属性:3...data:3

由此看出,单例service依然是单例

把service设成多例,代码如下 

package com.chs.nginxdemo.service;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Service;

@Service
@Scope("prototype")
public class SocketClient {
    private int index;

    public String doTrade() {
        return Integer.toString(index++);
    }

}

打印输出如下:

普通属性:0...静态属性:0...data:0
普通属性:0...静态属性:1...data:0
普通属性:0...静态属性:2...data:0
普通属性:0...静态属性:3...data:0
普通属性:0...静态属性:4...data:0

可以看出 data都是0,变成多例了。

 

综上所述,想比较简单的解决并发问题,需要controller和 service都设置成多例。

 

 

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

元气满满的码农

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值