Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Настройки: properties и YAML

Порт сервера, адрес базы данных, название сайта — всё это не стоит зашивать в код. Такие значения хранят в файле настроек, и Spring Boot читает его при запуске. Тогда одну и ту же программу можно запускать с разными настройками на вашем компьютере и на сервере.

Два формата

Генератор создал application.properties. Тот же набор настроек можно записать в формате YAML:

# src/main/resources/application.properties
spring.application.name=blog
server.port=8080
# src/main/resources/application.yaml
spring:
  application:
    name: blog
server:
  port: 8080

В YAML части имени через точку превращаются во вложенные блоки с отступом в два пробела. Spring читает оба файла одинаково. Дальше в курсе мы используем YAML: он нагляднее при большом числе настроек и, в отличие от .properties, читается в кодировке UTF-8 — русский текст в нём не ломается. Переименуйте файл в application.yaml и перепишите содержимое, как выше.

Свои настройки

Кроме настроек Spring можно добавить свои. Договоримся, что настройки блога начинаются с blog:

# src/main/resources/application.yaml
spring:
  application:
    name: blog
 
blog:
  title: Блог Анны и Олега
  contact-email: anna@example.com

Чтение через @Value

// src/main/java/com/example/blog/AboutController.java
package com.example.blog;
 
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class AboutController {
 
    private final String title;
    private final String contactEmail;
 
    public AboutController(@Value("${blog.title}") String title,
                           @Value("${blog.contact-email:info@example.com}") String contactEmail) {
        this.title = title;
        this.contactEmail = contactEmail;
    }
 
    @GetMapping("/api/about")
    public String about() {
        return title + " (" + contactEmail + ")";
    }
}

Выражение ${blog.title} Spring заменит значением из настроек. После двоеточия можно указать значение по умолчанию — оно сработает, если настройки нет. Запрос curl http://localhost:8080/api/about вернёт Блог Анны и Олега (anna@example.com).

Переопределение при запуске

Любую настройку можно поменять, не трогая файл:

./mvnw spring-boot:run -Dspring-boot.run.arguments=--server.port=9090
BLOG_TITLE="Тестовый блог" ./mvnw spring-boot:run

Первая команда передаёт аргумент командной строки, вторая — переменную окружения. Имя переменной получается из имени настройки: точки и дефисы заменяются на _, буквы становятся заглавными (blog.title → BLOG_TITLE).

ИсточникПриоритет
Аргументы командной строки --key=valueСамый высокий
Переменные окруженияВыше файла
application.yaml и application.propertiesБазовые значения

Частая ошибка

Если записать русский текст в application.properties, он придёт в программу испорченным:

Ðлог ÐÐ½Ð½Ñ Ð¸ Ðлега (anna@example.com)

Spring Boot читает файлы .properties в старой кодировке ISO-8859-1, а YAML — в UTF-8. Держите тексты на русском в application.yaml. И не оставляйте оба файла сразу: при одинаковых ключах значение из .properties побеждает, а после переименования выполните ./mvnw clean, чтобы старый файл не остался в папке target.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.