Gymterview
middle

Что такое @Conditional и условная конфигурация в Spring Boot?

@Conditional – базовая аннотация Spring для создания бинов только при выполнении определённых условий. Spring Boot расширяет её множеством специализированных аннотаций, которые лежат в основе механизма автоконфигурации.

Пример
@Configuration
public class ConditionalConfig {

    @Bean
    @ConditionalOnClass(name = "com.redis.RedisClient")
    public CacheManager redisCacheManager() {
        return new RedisCacheManager();
    }

    @Bean
    @ConditionalOnMissingBean(CacheManager.class)
    public CacheManager defaultCacheManager() {
        return new ConcurrentMapCacheManager();
    }

    @Bean
    @ConditionalOnProperty(name = "feature.notifications.enabled", havingValue = "true")
    public NotificationService notificationService() {
        return new EmailNotificationService();
    }
}

Feature toggles (частый кейс)

Пример
feature.new-payment-system.enabled=true
Пример
@Bean
@ConditionalOnProperty(name = "feature.new-payment-system.enabled", havingValue = "true")
public PaymentService newPaymentService() { return new NewPaymentService(); }

@Bean
@ConditionalOnProperty(name = "feature.new-payment-system.enabled",
                       havingValue = "false", matchIfMissing = true)
public PaymentService legacyPaymentService() { return new LegacyPaymentService(); }

Собственное условие

Пример
public class OnLinuxCondition implements Condition {
    @Override
    public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
        String os = System.getProperty("os.name");
        return os != null && os.toLowerCase().contains("linux");
    }
}

@Bean
@Conditional(OnLinuxCondition.class)
public FileWatcher linuxFileWatcher() { return new InotifyFileWatcher(); }

На собеседовании: покажите понимание @ConditionalOnMissingBean как основы автоконфигурации. Частая ошибка – чрезмерное использование @Conditional, превращающее конфигурацию в нечитаемую. Если логика сложная – используйте профили.