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
保持它的价值并且每次都增加。
我有以下 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
保持它的价值并且每次都增加。