Как сделать несколько конфигураций в Spring
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Несколько конфигураций в 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— для productionapplication-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();
}
}
Лучшие практики:
- Использовать @Profile для окружений — это стандартный подход
- Экспортировать чувствительные данные в переменные окружения — не хардкодить пароли
- Иметь базовые настройки в application.properties и переопределять их в специфичных файлах
- Тестировать разные профили — убедитесь, что конфигурация работает для каждого профиля
- Документировать активные профили — четко указывать, какой профиль для какого окружения
Такой подход обеспечивает гибкость и безопасность при развёртывании приложения в разных окружениях.