Какой scope у Spring-контроллера нужен для управления состоянием в рамках одного HTTP-запроса?

«Какой scope у Spring-контроллера нужен для управления состоянием в рамках одного HTTP-запроса?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для хранения состояния, уникального для каждого HTTP-запроса, контроллеру следует назначить scope request.

Практическое применение: Используйте аннотацию @RequestScope (Spring 5+) или @Scope("request"). Это гарантирует создание нового экземпляра бина для каждого входящего запроса, изолируя его поля от других запросов.

Пример:

@Controller
@RequestScope // Или @Scope("request")
public class RequestScopedController {
    private int requestCounter;

    @GetMapping("/increment")
    public ResponseEntity<Integer> handleRequest() {
        requestCounter++; // Это значение уникально для данного HTTP-запроса
        return ResponseEntity.ok(requestCounter);
    }
}

Почему это важно: Без явного указания scope request контроллер по умолчанию будет singleton. В этом случае поле requestCounter стало бы разделяемым состоянием между всеми запросами, приводя к race condition и некорректным данным.