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, превращающее конфигурацию в нечитаемую. Если логика сложная – используйте профили.