JavaRush /Курсы /Модуль 5. Spring /Лекция 125: Работа с внешними файлами конфигурации (appli...

Лекция 125: Работа с внешними файлами конфигурации (application.properties, YAML)

Модуль 5. Spring
13 уровень , 4 лекция
Открыта

Конфигурационные файлы — это своего рода "пульт управления" приложением. Вместо того чтобы жёстко кодировать переменные в коде, конфигурационные файлы позволяют легко изменять настройки приложения, такие как:

  • Адреса баз данных
  • Параметры серверов
  • API ключи
  • Логирование
  • Порты и так далее.

В реальной жизни, особенно в микросервисной архитектуре, конфигурационные файлы играют ключевую роль. Они помогают адаптировать микросервисы для разных сред: разработки (dev), тестирования (test), продакшена (prod). А ещё, согласись, менять конфигурацию проще в файле, чем заходить в код и заново пересобирать приложение!


Различие между application.properties и application.yml

Spring Boot поддерживает два основных формата конфигурационных файлов: properties и YAML. Давайте взглянем на их особенности.

Формат Особенности
application.properties - Стандартный формат key=value.
- Каждая настройка на отдельной строке
application.yml - YAML-формат: структура в виде отступов.
- Поддерживает вложенные секции

Пример application.properties


server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=admin
spring.datasource.password=secret
logging.level.org.springframework=DEBUG

Здесь всё просто: каждая строка — это пара ключ-значение.

Пример application.yml


server:
  port: 8080
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: admin
    password: secret
logging:
  level:
    org.springframework: DEBUG

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


Когда использовать properties, а когда YAML?

На практике можно использовать оба формата, и выбор зависит от ваших требований:

  • properties хорош, если конфигураций немного или когда вы привыкли работать в простых текстовых файлах.
  • YAML предпочтителен для сложных структур, так как поддерживает вложенности. Например, настройки нескольких сервисов легко группируются в YAML.

Как Spring работает с конфигурационными файлами?

Spring автоматически ищет конфигурационные файлы в стандартных местах, таких как:

  1. src/main/resources/application.properties
  2. src/main/resources/application.yml

При запуске приложение считывает параметры из этих файлов. Давайте протестируем это на практике.

Пример: использование application.properties

Создадим простой Spring Boot проект. Добавьте в src/main/resources/application.properties настройки:


server.port=9090
spring.application.name=DemoApp

Создадим контроллер для проверки:


@RestController
@RequestMapping("/api")
public class ConfigController {

    @Value("${spring.application.name}")
    private String appName;

    @GetMapping("/name")
    public String getAppName() {
        return "Application name: " + appName;
    }
}

При запуске приложения и вызове http://localhost:9090/api/name вы увидите:

Application name: DemoApp

Как вам такое, application.properties?

Пример: использование application.yml

Теперь переключимся на YAML. Создайте файл application.yml:


server:
  port: 8081
spring:
  application:
    name: DemoAppYAML

Повторите вызов http://localhost:8081/api/name. Результат:

Application name: DemoAppYAML

Как видите, в обоих случаях Spring легко считывает конфигурацию. Магия? Нет, просто мощь Spring Boot.


Комбинирование локальных и внешних конфигураций

Бывают ситуации, когда вам нужно объединить локальные (встроенные) и внешние конфигурационные файлы. Например, если часть параметров хранится локально, а часть — в Spring Cloud Config.

Пример загрузки конфигурации из двух источников

  1. Создайте локальный файл application.properties:
    server.port=8080
    logging.level.root=INFO
    
  2. В Spring Cloud Config Server храните другой набор:
    
    spring.datasource.url=jdbc:mysql://localhost:3306/production
    spring.datasource.username=prod_user
    spring.datasource.password=prod_password
    

Клиент-процесс будет объединять конфигурации: локальные параметры и параметры с сервера. Так Spring подхватывает лучшее из двух миров.


Подходы к многоуровневой конфигурации

Для сложных приложений часто используются профили (например, dev, test, prod). И здесь конфигурационные файлы играют ведущую роль.

Пример профилей с application.yml


server:
  port: 8080

spring:
  profiles:
    active: dev # Указываем, какой профиль использовать

---

spring:
  profiles: dev
  datasource:
    url: jdbc:mysql://localhost:3306/devdb
    username: dev_user
    password: dev_password

---

spring:
  profiles: prod
  datasource:
    url: jdbc:mysql://localhost:3306/proddb
    username: prod_user
    password: prod_password

По умолчанию активный профиль — dev. Но если вы запустите приложение с указанием профиля prod:

java -jar my-app.jar --spring.profiles.active=prod

Spring переключится на настройки продакшена.


Практика: сложные конфигурации

Давайте создадим проект, в котором мы используем оба формата конфигурации (properties и YAML), профили и Spring Cloud Config.

  1. Создайте локальную конфигурацию:
    logging.level.org.springframework=DEBUG
    logging.file.name=myapp.log
    spring.application.name=HybridApp
    
  2. Настройте application.yml для профилей:
    
    spring:
      profiles:
        default: dev
    
    ---
    spring:
      profiles: dev
      datasource:
        url: jdbc:mysql://localhost:3306/devdb
        username: dev_user
        password: dev_password
    
    ---
    spring:
      profiles: prod
      datasource:
        url: jdbc:mysql://localhost:3306/proddb
        username: prod_user
        password: prod_password
    
  3. Проект интегрируйте с Spring Cloud Config для извлечения дополнительных параметров. Настройте получение ключей API и секретов, например, из GIT.

Частые ошибки и их решение

Когда начинаешь работать с конфигурациями, можно столкнуться с проблемами:

  • Ошибка YAML: пропущен или лишний пробел в отступах. Spring безжалостно выбросит исключение.
  • Несогласованность конфигураций: если параметры дублируются в разных источниках, Spring берёт первый найденный. Убедитесь, что порядок загрузки файлов вам понятен.
  • Несоответствие профилей: если вы не указали spring.profiles.active, приложение выберет дефолтные настройки.

Теперь ваши микросервисы оснащены идеальным управлением. Впереди нас ждёт ещё больше магии Spring Cloud! 🎩✨

Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ