← Назад к вопросам
Приведи пример использования @ConditionalOn
1.8 Middle🔥 201 комментариев
#Spring Boot и Spring Data
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
@ConditionalOn в Spring Boot
Что это?
@ConditionalOn — это семейство аннотаций в Spring Boot для условной регистрации бинов. Они позволяют включать или исключать компоненты в зависимости от различных условий: наличия класса в classpath, значений свойств, наличия других бинов и т.д.
Основные типы @ConditionalOn
- @ConditionalOnClass — бин создаётся только если класс присутствует в classpath
- @ConditionalOnMissingClass — бин создаётся если класса НЕ в classpath
- @ConditionalOnProperty — бин создаётся если свойство имеет нужное значение
- @ConditionalOnBean — бин создаётся если другой бин существует
- @ConditionalOnMissingBean — бин создаётся если другого бина нет
Практический пример
Этот пример показывает автоматическое создание клиента для различных баз данных:
// Database client интерфейс
public interface DatabaseClient {
void connect();
}
// PostgreSQL реализация
@Configuration
@ConditionalOnClass(name = "org.postgresql.Driver")
@ConditionalOnProperty(name = "app.database", havingValue = "postgresql")
public class PostgreSQLConfiguration {
@Bean
public DatabaseClient postgresClient() {
return new PostgreSQLClient();
}
}
public class PostgreSQLClient implements DatabaseClient {
@Override
public void connect() {
System.out.println("Подключение к PostgreSQL");
}
}
// MongoDB реализация
@Configuration
@ConditionalOnClass(name = "com.mongodb.client.MongoClient")
@ConditionalOnProperty(name = "app.database", havingValue = "mongodb")
public class MongoDBConfiguration {
@Bean
public DatabaseClient mongoClient() {
return new MongoDBClient();
}
}
public class MongoDBClient implements DatabaseClient {
@Override
public void connect() {
System.out.println("Подключение к MongoDB");
}
}
В application.properties:
app.database=postgresql
Ещё один пример с @ConditionalOnBean
@Configuration
public class CacheConfiguration {
// Дефолтный кэш
@Bean
@ConditionalOnMissingBean
public CacheManager defaultCache() {
return new SimpleCacheManager();
}
// Redis кэш, если RedisTemplate уже есть
@Bean
@ConditionalOnBean(RedisTemplate.class)
public CacheManager redisCache(RedisTemplate<String, Object> template) {
return new RedisCacheManager(template);
}
}
Когда использовать?
- Условные зависимости — Datasource разные в dev/prod
- Optional компоненты — логирование, мониторинг
- Auto-configuration — Spring Boot сам конфигурирует зависимости
- Plugin архитектура — включение модулей по условию
Преимущества
- Гибкость — один код работает в разных окружениях
- Упрощение — не нужны большие if/else блоки
- Производительность — ненужные бины не создаются
- Чистота кода — конфигурация явная и читаемая