Какую роль играет аннотация @Conditional в Spring?

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

Ответ

Аннотация @Conditional — это механизм условного создания бинов в контексте Spring. Она позволяет регистрировать бин только при выполнении определенного условия, что критически важно для гибкой, зависящей от среды конфигурации.

Зачем это нужно?

  • Активация бинов только для определенного профиля (например, dev/prod).
  • Регистрация бинов только если в classpath присутствует определенная библиотека.
  • Создание бина в зависимости от значения свойства в application.properties.
  • Сложная бизнес-логика для определения необходимости бина.

Пример с @ConditionalOnProperty (готовое условие из Spring Boot):

@Configuration
public class FeatureConfig {

    @Bean
    @ConditionalOnProperty(
        name = "app.feature.advanced-logging.enabled",
        havingValue = "true",
        matchIfMissing = false // Бин не создастся, если свойство отсутствует или равно false
    )
    public AdvancedLogger advancedLogger() {
        return new AdvancedLogger();
    }
}

Пример создания собственного условия:

  1. Реализуйте интерфейс Condition:
    public class OnProductionCondition implements Condition {
        @Override
        public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
            // Логика проверки
            String env = context.getEnvironment().getProperty("app.environment");
            return "production".equalsIgnoreCase(env);
        }
    }
  2. Используйте его с @Conditional:
    @Configuration
    public class DataSourceConfig {
        @Bean
        @Conditional(OnProductionCondition.class)
        public DataSource productionDataSource() {
            // Создаем DataSource только для production
            return new HikariDataSource(...);
        }
    }

Практический результат: Позволяет создавать чистые, адаптивные конфигурации, избегая условных операторов (if) в коде и управляя поведением приложения через внешние параметры.