弹簧MVC Rest控制器范围

我有以下控制器: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


答案 1

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

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

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


答案 2

A 不是为每个请求创建的,而是为每个请求都保持不变。因此,您保持其价值,并且每次都会增加。@RestControllercounter


推荐