Ответ
Аннотация @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();
}
}
Пример создания собственного условия:
- Реализуйте интерфейс
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); } } - Используйте его с
@Conditional:@Configuration public class DataSourceConfig { @Bean @Conditional(OnProductionCondition.class) public DataSource productionDataSource() { // Создаем DataSource только для production return new HikariDataSource(...); } }
Практический результат: Позволяет создавать чистые, адаптивные конфигурации, избегая условных операторов (if) в коде и управляя поведением приложения через внешние параметры.