@Value — тихая ловушка Spring'аСегодня покажу вам, почему аннотация
@Value — не лучший выбор для работы с конфигурацией, особенно в Spring Boot 3+.Допустим, у вас такой конфиг:
@Value("${app.timeout:30}")
private int timeout;
📌 Проблема #1: Плохая валидация
Если значение в
application.yaml невалидное (например, timeout: abc), приложение *упадёт при старте*, но вы получите лишь общее сообщение Failed to bind…, без точной причины.📌 Проблема #2: Нет автокомплита
IDE не сможет подсказать, какие свойства вообще есть. Рефакторинг ключей — боль.
📌 Проблема #3: Тестирование
Труднее подменить значения в тестах:
@Value не так просто "подсунуть" моками.✅ Современный подход — использовать
@ConfigurationProperties:
@ConfigurationProperties(prefix = "app")
@Configuration
public class AppProperties {
private Duration timeout = Duration.ofSeconds(30);
// геттеры/сеттеры
}
И в
application.yaml:
app:
timeout: 30s
💡 Spring сам сконвертирует
30s в Duration, поддержит автокомплит в IDE, и вы сможете валидировать значения с @Validated.⚠️ Не забудьте включить бин:
@EnableConfigurationProperties(AppProperties.class)
📌 Резюме:
@Value — для быстрых хаков. Для серьёзной конфигурации — @ConfigurationProperties.👉 @java_geek