Перейти к основному содержимому

Использование application.yml и application.properties в Spring Boot

· 4 мин. чтения

1. Обзор

Распространенной практикой в Spring Boot является использование внешней конфигурации для определения наших свойств . Это позволяет нам использовать один и тот же код приложения в разных средах.

Мы можем использовать файлы свойств, файлы YAML, переменные среды и аргументы командной строки.

В этом кратком руководстве мы рассмотрим основные различия между свойствами и файлами YAML.

2. Конфигурация свойств

По умолчанию Spring Boot может получить доступ к конфигурациям, установленным в файле application.properties , который использует формат ключ-значение:

spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
spring.datasource.password=password

Здесь каждая строка представляет собой одну конфигурацию, поэтому нам нужно выразить иерархические данные, используя одни и те же префиксы для наших ключей. И в этом примере каждый ключ принадлежит spring.datasource .

2.1. Заполнители в свойствах

Внутри наших значений мы можем использовать заполнители с синтаксисом ${} для ссылки на содержимое других ключей, системных свойств или переменных среды:

app.name=MyApp
app.description=${app.name} is a Spring Boot application

2.2. Структура списка

Если у нас есть одинаковые свойства с разными значениями, мы можем представить структуру списка с индексами массива:

application.servers[0].ip=127.0.0.1
application.servers[0].path=/path1
application.servers[1].ip=127.0.0.2
application.servers[1].path=/path2
application.servers[2].ip=127.0.0.3
application.servers[2].path=/path3

2.3. Несколько профилей

Начиная с версии 2.4.0, Spring Boot поддерживает создание файлов свойств, состоящих из нескольких документов. Проще говоря, мы можем разделить один физический файл на несколько логических документов.

Это позволяет нам определить документ для каждого профиля, который нам нужно объявить, в одном и том же файле:

logging.file.name=myapplication.log
bael.property=defaultValue
#---
spring.config.activate.on-profile=dev
spring.datasource.password=password
spring.datasource.url=jdbc:h2:dev
spring.datasource.username=SA
bael.property=devValue
#---
spring.config.activate.on-profile=prod
spring.datasource.password=password
spring.datasource.url=jdbc:h2:prod
spring.datasource.username=prodUser
bael.property=prodValue

Обратите внимание, что мы используем нотацию '#---', чтобы указать, где мы хотим разделить документ.

В этом примере у нас есть две пружинные секции с разными профилями . Также у нас может быть общий набор свойств на корневом уровне — в этом случае свойство logging.file.name будет одинаковым во всех профилях.

2.4. Профили в нескольких файлах

В качестве альтернативы использованию разных профилей в одном файле мы можем хранить несколько профилей в разных файлах. До версии 2.4.0 это был единственный метод, доступный для файлов свойств .

Этого мы добиваемся, помещая имя профиля в имя файла — например, application-dev.yml или application-dev.properties .

3. Конфигурация YAML

3.1. YAML-формат

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

Теперь давайте возьмем тот же пример из нашего файла свойств и преобразуем его в YAML:

spring:
datasource:
password: password
url: jdbc:h2:dev
username: SA

Это может быть более удобочитаемым, чем альтернативный файл свойств, поскольку он не содержит повторяющихся префиксов.

3.2. Структура списка

YAML имеет более краткий формат для выражения списков:

application:
servers:
- ip: '127.0.0.1'
path: '/path1'
- ip: '127.0.0.2'
path: '/path2'
- ip: '127.0.0.3'
path: '/path3'

3.3. Несколько профилей

В отличие от файлов свойств, YAML изначально поддерживает файлы с несколькими документами, и таким образом мы можем хранить несколько профилей в одном файле независимо от того, какую версию Spring Boot мы используем.

Однако в этом случае спецификация указывает, что мы должны использовать три дефиса для обозначения начала нового документа :

logging:
file:
name: myapplication.log
---
spring:
config:
activate:
on-profile: staging
datasource:
password: 'password'
url: jdbc:h2:staging
username: SA
bael:
property: stagingValue

Примечание. Обычно мы не хотим одновременно включать в наш проект стандартные файлы application.properties и application.yml , так как это может привести к неожиданным результатам.

Например, если мы объединим показанные выше свойства (в файле application.yml ) со свойствами, описанными в разделе 2.3., тогда bael.property будет присвоено значение по умолчанию, а не значение, зависящее от профиля. Это просто потому, что application.properties загружаются позже, переопределяя значения, назначенные до этого момента.

4. Использование Spring Boot

Теперь, когда мы определили наши конфигурации, давайте посмотрим, как получить к ним доступ.

4.1. Аннотация значения

Мы можем внедрить значения наших свойств, используя аннотацию @Value :

@Value("${key.something}")
private String injectedProperty;

Здесь свойство key.something вводится через внедрение поля в один из наших объектов.

4.2. Абстракция среды

Мы также можем получить значение свойства с помощью Environment API:

@Autowired
private Environment env;

public String getSomeKey(){
return env.getProperty("key.something");
}

4.3. Аннотация свойств конфигурации

Наконец, мы также можем использовать аннотацию @ConfigurationProperties для привязки наших свойств к типобезопасным структурированным объектам:

@ConfigurationProperties(prefix = "mail")
public class ConfigProperties {
String name;
String description;
...

5. Вывод

В этой статье мы увидели некоторые различия между свойствами и файлами конфигурации yml Spring Boot. Мы также увидели, как их значения могут ссылаться на другие свойства. Наконец, мы рассмотрели, как внедрить значения в нашу среду выполнения.

Как всегда, все примеры кода доступны на GitHub .