Вопрос 29 · Раздел 5

Что такое profiles in Spring?

Профили vs Feature Flags: если нужно включать/выключать функциональность в production БЕЗ перезапуска — используйте Feature Flags (Unleash, LaunchDarkly). Если разная инфраструк...

Версии по языкам: English Russian Ukrainian

🟢 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

  1. Не храните секреты в application.yaml
  2. Требуйте профиль для prod → validation
  3. Profile Groups → группировка
  4. Feature Flags → для бизнес-логики
  5. Cloud Config → внешнее управление
  6. @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. Что такое starter в Spring Boot]]
  • [[21. Как работает @SpringBootApplication]]
  • [[24. Что такое @Configuration класс]]
  • [[27. Что делать, если есть несколько бинов одного типа]]