← Назад к вопросам

Приведи пример использования @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 блоки
  • Производительность — ненужные бины не создаются
  • Чистота кода — конфигурация явная и читаемая