Що таке profiles in Spring?
Профілі vs Feature Flags: якщо потрібно вмикати/вимикати функціональність в production БЕЗ перезапуску — використовуйте Feature Flags (Unleash, LaunchDarkly). Якщо різна інфраст...
🟢 Junior Level
Profiles — спосіб використовувати різні налаштування для різних оточень (dev, test, prod).
# application.yaml (загальні налаштування)
server.port: 8080
# application-dev.yaml (для розробки)
spring.datasource.url: jdbc:h2:mem:dev
# application-prod.yaml (для продакшену)
spring.datasource.url: jdbc:postgresql://prod-db:5432/mydb
Активація:
java -jar app.jar --spring.profiles.active=prod
🟡 Middle Level
Способи активації
# 1. Командний рядок
--spring.profiles.active=prod
# 2. Змінна оточення
SPRING_PROFILES_ACTIVE=prod
# 3. JVM параметр
-Dspring.profiles.active=prod
# 4. У тестах
@ActiveProfiles("test")
@Profile на бінах
@Bean
@Profile("dev")
public DataSource devDataSource() { ... }
@Bean
@Profile("prod")
public DataSource prodDataSource() { ... }
Логічні вирази
@Profile("prod & !cloud") // Prod, але не в хмарі
// Spring 5.1+ підтримує логічні оператори в @Profile: &, |, !
@Profile("dev | test") // Dev або test
@Profile("prod & (mysql | postgres)") // Складні умови
🔴 Senior Level
Profile Groups
spring:
profiles:
group:
"highload": "cache, async, metrics"
# Активація highload → включає cache, async, metrics
Profile-specific Imports (Boot 2.4+)
# application.yaml
server.port: 8080
---
spring.config.activate.on-profile: dev
server.port: 9090
---
spring.config.activate.on-profile: prod
server.port: 80
Profiles vs Feature Flags
Profiles:
→ Інфраструктура (БД, черги)
→ Вимагає перезапуску
Feature Flags:
→ Бізнес-логіка
→ Змінюються на льоту
→ Не плутайте!
Профілі vs Feature Flags: якщо потрібно вмикати/вимикати функціональність в production БЕЗ перезапуску — використовуйте Feature Flags (Unleash, LaunchDarkly). Якщо різна інфраструктура для dev/test/prod — Profiles.
Cloud-Native
Kubernetes ConfigMaps → замінюють профілі
Spring Cloud Config → зовнішній сервер конфігів
HashiCorp Vault → секрети
Профілі → місток до зовнішніх конфігів
Production Experience
Реальний сценарій: забули активувати prod
Додаток стартував з default профілем
→ Підключився до dev БД!
→ Втрата даних!
Рішення:
→ Вимагати профіль через validation
→ ConfigMaps в K8s
Діагностика
# Активні профілі:
/actuator/env → activeProfiles
# Лог при старті:
"The following 1 profile is active: prod"
# Програмно:
@Autowired Environment env;
env.getActiveProfiles();
Best Practices
- Не зберігайте секрети в application.yaml
- Вимагайте профіль для prod → validation
- Profile Groups → групування
- Feature Flags → для бізнес-логіки
- Cloud Config → зовнішнє керування
- @ActiveProfiles → для тестів
Резюме для Senior
- Profiles → різна конфігурація для оточень
- Пріоритет джерел (від вищого до нижчого): CLI аргументи > JVM -D параметри > змінні оточення > application-{profile}.properties > application.properties
- Groups → об’єднання профілів
- Profile vs Feature Flags → інфраструктура vs бізнес
- Cloud-Native → ConfigMaps, Vault
- Validation → вимагайте профіль для prod
🎯 Шпаргалка для інтерв’ю
Обов’язково знати:
- Profiles — механізм різної конфігурації для оточень (dev, test, prod)
- Активація: –spring.profiles.active, SPRING_PROFILES_ACTIVE, JVM -D, @ActiveProfiles в тестах
- @Profile на @Bean методах та класах — бін створюється тільки при активному профілі
-
Логічні вирази в @Profile (Spring 5.1+): “prod & !cloud”, “dev test” - Profile Groups (Spring Boot 2.4+): один профіль активує групу — spring.profiles.group
- Multi-document YAML: кілька профілів в одному файлі через spring.config.activate.on-profile
- Profiles != Feature Flags: профілі — інфраструктура (перезапуск), прапорці — бізнес-логіка (на льоту)
Часті уточнюючі запитання:
- Як активувати кілька профілів? — Через кому: –spring.profiles.active=prod,cache,async.
- Що буде, якщо не активувати жоден профіль? — Використовуються тільки application.yaml (дефолтні налаштування) — небезпечно для prod.
- Чим Profiles відрізняються від Feature Flags? — Profiles вимагають перезапуску та змінюють інфраструктуру; Feature Flags перемикають бізнес-логіку на льоту.
- Як гарантувати запуск тільки з потрібним профілем? — Validation: перевірити env.getActiveProfiles() при старті та викинути помилку, якщо prod без профілю.
Червоні прапорці (НЕ говорити):
- «Профілі можна змінювати без перезапуску» — ні, активація тільки при старті.
- «Feature Flags — це те саме, що Profiles» — ні, прапорці змінюють бізнес-логіку на льоту.
- «Секрети можна зберігати в application-prod.yaml» — ні, використовуйте Vault, K8s Secrets, CI/CD variables.
- «Profile groups замінюють окремі профілі» — ні, groups — це аліас для набору профілів.
Пов’язані теми:
- [[22. Що таке стартер в Spring Boot]]
- [[21. Як працює @SpringBootApplication]]
- [[24. Що таке @Configuration клас]]
- [[27. Що робити, якщо є кілька бінів одного типу]]