Spring中@Service单例的理解

原本我一直以为spring的中单例是指对当前线程来说单例,但自己测试了一下发现不是这么回事,测试过程如下

写了一个被调用的借口

@RestController
@Slf4j
public class SingletonEndpoint {

    @Autowired
    private SingletonService singletonService;

    @RequestMapping(value = "testSingleton" ,method = RequestMethod.GET)
    public String testSingleton(){
        log.info("单例的测试开始,controller 的线程号为:{},SingletonService的id为:{}",Thread.currentThread().getId()
        ,this.hashCode());
        singletonService.testSingleton();
        singletonService.testSingleton();
        singletonService.testSingleton();
        singletonService.testSingleton();
        return "success";
    }
}

一个@Service

@Service
@Slf4j
public class SingletonService {
    public void testSingleton(){
      log.info("测试单例的service,当前的线程id为:{},服务id:{}",Thread.currentThread().getId(),this.toString());
    }
}

一个测试类

  @Test
    public void testThreadLocal(){

        for(int i =0;i<100;i++){
            Thread thread = new Thread(() -> {
                RestTemplate rest = new RestTemplate();
                ResponseEntity<String> forEntity = rest.getForEntity("http://localhost:8080/testSingleton", String.class);
            });

            thread.run();
        }

    }

测试结果,就不全贴了,很明显,一个接口被调用,会新起一个线程来跑,调用的Controller层和Service层都不是新生成的。所以这个单例并不是线层里的单例,而是整个服务容器里的单例。

所以这家餐厅并不是进去一个人跟一个服务员,而是不管进去多少人,都是这个服务员,只是他够快。看到这如果觉得浪费了你几分钟,那就不好意思,我确实很菜,但是如果你心里也有这个疑惑,那这个可能有用,如果你发现我这个不对,还请大佬斧正,只要您说的对,喷我也没关系,谢谢!

2018-11-04 20:37:01.264  INFO 15584 --- [nio-8080-exec-1] c.p.t.endpoint.SingletonEndpoint         : 单例的测试开始,controller 的线程号为:96,SingletonService的id为:561740664
2018-11-04 20:37:01.264  INFO 15584 --- [nio-8080-exec-1] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:96,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.264  INFO 15584 --- [nio-8080-exec-1] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:96,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.264  INFO 15584 --- [nio-8080-exec-1] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:96,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.264  INFO 15584 --- [nio-8080-exec-1] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:96,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.283  INFO 15584 --- [nio-8080-exec-2] c.p.t.endpoint.SingletonEndpoint         : 单例的测试开始,controller 的线程号为:97,SingletonService的id为:561740664
2018-11-04 20:37:01.283  INFO 15584 --- [nio-8080-exec-2] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:97,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.283  INFO 15584 --- [nio-8080-exec-2] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:97,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.283  INFO 15584 --- [nio-8080-exec-2] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:97,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.283  INFO 15584 --- [nio-8080-exec-2] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:97,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.291  INFO 15584 --- [nio-8080-exec-3] c.p.t.endpoint.SingletonEndpoint         : 单例的测试开始,controller 的线程号为:98,SingletonService的id为:561740664
2018-11-04 20:37:01.291  INFO 15584 --- [nio-8080-exec-3] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:98,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.291  INFO 15584 --- [nio-8080-exec-3] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:98,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.291  INFO 15584 --- [nio-8080-exec-3] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:98,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.291  INFO 15584 --- [nio-8080-exec-3] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:98,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.300  INFO 15584 --- [nio-8080-exec-4] c.p.t.endpoint.SingletonEndpoint         : 单例的测试开始,controller 的线程号为:99,SingletonService的id为:561740664
2018-11-04 20:37:01.300  INFO 15584 --- [nio-8080-exec-4] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:99,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.300  INFO 15584 --- [nio-8080-exec-4] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:99,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.300  INFO 15584 --- [nio-8080-exec-4] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:99,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.300  INFO 15584 --- [nio-8080-exec-4] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:99,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.308  INFO 15584 --- [nio-8080-exec-5] c.p.t.endpoint.SingletonEndpoint         : 单例的测试开始,controller 的线程号为:100,SingletonService的id为:561740664
2018-11-04 20:37:01.308  INFO 15584 --- [nio-8080-exec-5] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:100,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.308  INFO 15584 --- [nio-8080-exec-5] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:100,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.308  INFO 15584 --- [nio-8080-exec-5] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:100,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.308  INFO 15584 --- [nio-8080-exec-5] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:100,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.317  INFO 15584 --- [nio-8080-exec-6] c.p.t.endpoint.SingletonEndpoint         : 单例的测试开始,controller 的线程号为:101,SingletonService的id为:561740664
2018-11-04 20:37:01.318  INFO 15584 --- [nio-8080-exec-6] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:101,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.318  INFO 15584 --- [nio-8080-exec-6] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:101,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.318  INFO 15584 --- [nio-8080-exec-6] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:101,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.318  INFO 15584 --- [nio-8080-exec-6] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:101,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.329  INFO 15584 --- [nio-8080-exec-7] c.p.t.endpoint.SingletonEndpoint         : 单例的测试开始,controller 的线程号为:102,SingletonService的id为:561740664
2018-11-04 20:37:01.329  INFO 15584 --- [nio-8080-exec-7] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:102,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.329  INFO 15584 --- [nio-8080-exec-7] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:102,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.329  INFO 15584 --- [nio-8080-exec-7] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:102,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.329  INFO 15584 --- [nio-8080-exec-7] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:102,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.335  INFO 15584 --- [nio-8080-exec-8] c.p.t.endpoint.SingletonEndpoint         : 单例的测试开始,controller 的线程号为:103,SingletonService的id为:561740664
2018-11-04 20:37:01.335  INFO 15584 --- [nio-8080-exec-8] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:103,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.335  INFO 15584 --- [nio-8080-exec-8] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:103,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.335  INFO 15584 --- [nio-8080-exec-8] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:103,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.335  INFO 15584 --- [nio-8080-exec-8] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:103,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.340  INFO 15584 --- [nio-8080-exec-9] c.p.t.endpoint.SingletonEndpoint         : 单例的测试开始,controller 的线程号为:104,SingletonService的id为:561740664
2018-11-04 20:37:01.340  INFO 15584 --- [nio-8080-exec-9] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:104,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.340  INFO 15584 --- [nio-8080-exec-9] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:104,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.340  INFO 15584 --- [nio-8080-exec-9] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:104,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.340  INFO 15584 --- [nio-8080-exec-9] c.p.t.R.SingletonService                 : 测试单例的service,当前的线程id为:104,服务id:com.plumwine.test_for_resttemplete.RestTempleService.SingletonService@2544fb8f
2018-11-04 20:37:01.345  INFO 15584 --- [io-8080-exec-10] c.p.t.endpoint.SingletonEndpoint         : 单例的测试开始,controller 的线程号为:105,SingletonService的id为:561740664

 

 

 

 

 

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值