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

Как сделать несколько конфигураций в Spring

1.0 Junior🔥 211 комментариев
#Spring Boot и Spring Data

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Несколько конфигураций в Spring

В Spring приложениях часто возникает необходимость иметь разные конфигурации для разных окружений (разработка, тестирование, production). Есть несколько подходов к организации нескольких конфигураций.

1. Использование @Profile

Это самый распространённый и рекомендуемый подход. С помощью аннотации @Profile можно создавать бины, которые будут загружаться только в определённых профилях:

@Configuration
@Profile("development")
public class DevelopmentConfig {
    @Bean
    public DataSource dataSource() {
        return new DataSource("jdbc:mysql://localhost:3306/devdb");
    }
}

@Configuration
@Profile("production")
public class ProductionConfig {
    @Bean
    public DataSource dataSource() {
        return new DataSource("jdbc:mysql://prod-server:3306/proddb");
    }
}

Активировать профиль можно несколькими способами:

  • В application.properties: spring.profiles.active=development
  • Через переменную окружения: SPRING_PROFILES_ACTIVE=development
  • Программно: environment.setActiveProfiles("development")
  • В тестах: @SpringBootTest(properties = "spring.profiles.active=test")

2. Свойства в разных файлах (Environment-specific Properties)

Spring позволяет разделить настройки по файлам в зависимости от активного профиля:

  • application.properties — общие настройки
  • application-dev.properties — для разработки
  • application-prod.properties — для production
  • application-test.properties — для тестов

Пример содержимого файлов:

# application-dev.properties
spring.datasource.url=jdbc:mysql://localhost:3306/devdb
spring.datasource.username=dev_user
spring.datasource.password=dev_pass
logging.level.root=DEBUG

# application-prod.properties
spring.datasource.url=jdbc:mysql://prod-server:3306/proddb
spring.datasource.username=prod_user
spring.datasource.password=prod_pass
logging.level.root=WARN

3. ConfigurationProperties с YAML

Для более сложных конфигураций используют типизированные свойства:

@Configuration
@ConfigurationProperties(prefix = "app")
@Data
public class AppProperties {
    private String apiKey;
    private int maxConnections;
    private String serverUrl;
}

В application-prod.yml:

app:
  apiKey: ${API_KEY:}
  maxConnections: 100
  serverUrl: https://api.production.com

4. Условные конфигурации (@ConditionalOnProperty)

Можно создавать бины в зависимости от значения свойства:

@Configuration
public class FeatureToggleConfig {
    @Bean
    @ConditionalOnProperty(name = "feature.caching.enabled", havingValue = "true")
    public CacheManager cacheManager() {
        return new RedisCacheManager();
    }
}

5. Несколько конфигурационных классов

Можно создавать отдельные конфигурационные классы и подгружать их селективно:

@Configuration
public class MainConfig {
    @Bean
    public DataSource dataSource() {
        return new DataSource();
    }
}

@Configuration
@Profile("!production")
public class DevelopmentExtras {
    @Bean
    public H2Console h2Console() {
        return new H2Console();
    }
}

Лучшие практики:

  1. Использовать @Profile для окружений — это стандартный подход
  2. Экспортировать чувствительные данные в переменные окружения — не хардкодить пароли
  3. Иметь базовые настройки в application.properties и переопределять их в специфичных файлах
  4. Тестировать разные профили — убедитесь, что конфигурация работает для каждого профиля
  5. Документировать активные профили — четко указывать, какой профиль для какого окружения

Такой подход обеспечивает гибкость и безопасность при развёртывании приложения в разных окружениях.

Как сделать несколько конфигураций в Spring | PrepBro