2015-10-15 64 views
8

我有以下Spring控制器:弹簧MVC RestController范围

package hello; 

import java.util.concurrent.atomic.AtomicLong; 

import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class TestController { 
    private final AtomicLong counter = new AtomicLong(); 

    @RequestMapping("/test") 
    public String test() { 
     long val = counter.incrementAndGet(); 
     return String.valueOf(val); 
    } 
} 

每次我访问REST API,它返回一个递增的值。 我刚刚学习Java,我想知道为什么它不总是返回1,因为每次请求发出时都必须创建AtomicLong的新实例。

+2

你为什么认为它正在创建一个新实例? – chrylis

+0

@chrylis:我来自.net背景,只是与它进行比较。 –

回答

9

不,TestController bean实际上是一个单身人士。 @RestController注释声明一个Spring @Component,其范围默认为SINGLETON。这在@Scope注释中有记录:

默认为空字符串(“”),这意味着SCOPE_SINGLETON。

这意味着它将是处理每个请求的相同实例TestController。由于counter是一个实例变量,因此每个请求都是相同的。

+0

保持单例或将范围设置为所谓的'prototype'是否是一个好习惯? –

+0

@BabuJames对于Controller来说,我认为最好保持一个singleton。 'Controller'通常不是有状态的,所以将它们变成单例是有意义的。 – Tunaki

2

A @RestController未针对每个请求创建,它对于每个请求都保持不变。所以你的counter保持其价值,并每次增加。