@Value в static-поле Spring — тихо остаётся null

Разработчик добавляет константу конфигурации через @Value на static-поле, чтобы обратиться к ней из статического метода-утилиты. Код компилируется, приложение стартует без единой ошибки.

Поле остаётся null (или значение по умолчанию для примитивов — 0 или false). AutowiredAnnotationBeanPostProcessor, который обрабатывает и @Autowired, и @Value, явно пропускает static-поля и пишет предупреждение уровня WARN в лог — но кто читает логи старта на проде.

Причина в модели DI Spring: контейнер инжектит зависимости в поля конкретного экземпляра бина после его создания. Static-поле принадлежит классу, а не инстансу — Spring физически не может положить туда значение через свой контракт DI.

@Component public class LimitConfig {

@Value("${app.limit}") private static int limit; }

На собеседовании спросят: как тогда получить значение из static-контекста. Через non-static сеттер: Spring вызывает обычный setter, который сам присваивает значение static-полю. Или через @PostConstruct в инстанс-методе.

Static и Spring DI живут в разных моделях жизненного цикла — смешивать их приходится руками, а не аннотациями.

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки