Java Core senior
В чём проблема — несколько связанных пунктов?
Ответ
Несколько связанных проблем. (1) Поле не final — может быть случайно перезаписано, в том числе через reflection. Для thread-safe сервиса (а Spring singleton — он всегда thread-safe должен быть) — это потенциальная проблема: singleton один на контейнер и разделяется между потоками, поэтому изменяемое состояние даёт гонки. Решение — делать поля final/неизменяемыми и инжектить через конструктор.
Разбор: Spring singleton по умолчанию один на контейнер и разделяется между всеми потоками, поэтому изменяемое (не-final) состояние в нём — источник гонок и его лучше делать final / неизменяемым либо инжектить через конструктор. Неверно, что бин создаётся на каждый запрос (это scope prototype/request), что volatile сам по себе решает все гонки и что конструкторная инъекция в singleton приводит к NPE.
Хочешь так же по своей компании — с вопросами по грейдам и задачами? Закажи гайд или забери свежее в Telegram.