Spring MVC RestController 范围

Spring MVC RestController scope

我有以下 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,它 return 都是一个递增的值。 我正在学习 Java,我想知道为什么它并不总是 return 1,因为每次请求到来时都必须创建 AtomicLong 的新实例。

不,TestController bean 实际上是一个单例。 @RestController annotation declares a Spring @Component whose scope is by default SINGLETON. This is documented in the @Scope 注释:

Defaults to an empty string ("") which implies SCOPE_SINGLETON.

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

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