14

我有以下Spring控制器:

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每次请求到来时都必须创建一个新的实例。

4

2 回答 2

17

不,TestControllerbean 实际上是一个单例。@RestController注释声明了一个 Spring @Component,其范围默认为SINGLETON。这记录在@Scope注释中:

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

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

于 2015-10-15T07:29:38.407 回答
4

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

于 2015-10-15T07:29:46.220 回答