Получить доступ

Зачем нужны @Conditional и ConditionalOn... аннотации в Spring Boot?

MiddleSpring Boot и ActuatorSpring Boot
Ещё спрашивают так:
  • Как сделать бин, который создаётся только при условии?
Коротко

@Conditional создаёт бин или конфигурацию только при выполнении условия. На этом построена вся автоконфигурация Spring Boot: @ConditionalOnClass, @ConditionalOnMissingBean, @ConditionalOnProperty, @ConditionalOnBean.

  • OnMissingBean — «по умолчанию, если пользователь не задал свой»
  • OnProperty — включение функции флагом в настройках
  • Условия на OnBean зависят от порядка обработки — использовать в автоконфигурациях с @AutoConfiguration(after=…)

А ещё @Profile — частный случай условия

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Базовый механизм: @Conditional(MyCondition.class) и класс, реализующий Condition.matches(context, metadata). Если false, бин или вся @Configuration не регистрируются.

Готовые условия Spring Boot:

  • @ConditionalOnClass / OnMissingClass — есть ли класс на classpath (библиотека подключена);
  • @ConditionalOnBean / @ConditionalOnMissingBean — есть ли бин такого типа; второе — основа переопределения: «создам ObjectMapper, только если вы не создали свой»;
  • @ConditionalOnProperty(name = "features.reports.enabled", havingValue = "true") — включение по настройке;
  • @ConditionalOnWebApplication, @ConditionalOnResource, @ConditionalOnExpression, @ConditionalOnJava, @ConditionalOnCloudPlatform.

**Подводный камень OnBean:** условие проверяется в момент обработки конфигурации. Если нужный бин регистрируется позже, условие не сработает. Поэтому в пользовательских @Configuration его избегают, а в автоконфигурациях задают порядок (@AutoConfiguration(after = DataSourceAutoConfiguration.class)).

Отладка: отчёт условий — --debug или /actuator/conditions.

Пример

@Configuration
class ReportsConfig {
    @Bean
    @ConditionalOnProperty(prefix = "features.reports", name = "enabled", havingValue = "true")
    ReportScheduler reportScheduler() { return new ReportScheduler(); }
}

Что хотят услышать

  • Механизм @Conditional.
  • Готовые условия Spring Boot и их роль в автоконфигурации.
  • Подводный камень OnBean и порядок.

Частые ошибки

  • Использовать @ConditionalOnBean в обычной конфигурации и удивляться, что бин не создаётся.

Что спросят дальше

  • Что делает @ConditionalOnMissingBean?
  • Как посмотреть condition evaluation report?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем