Использование двух файлов yaml для свойств конфигурации

Мы используем весеннее загрузочное приложение, где свойства загружаются из файла application.yml вместо application.properties, расположенного в каталоге src/main/resources/ который выглядит следующим образом:

config: 
  host: localhost:8080  
  server: 123  

И они вытягиваются в файл .java как это

@ConfigurationProperties( prefix="config")  
public class ConnectionImpl implements Connection{
  @Value("${config.host}")
  private Stringhost;
} 

Я могу получить свойства таким образом. Но мы пытаемся переместить свойства конфигурации из application.yml в другой файл .yml который находится в другом месте. (src/main/resources/env-config).
Теперь я не могу получить свойства таким же образом, т.е. используя аннотацию @Value. Есть ли еще какие-то аннотации, которые мне нужно добавить?

Ответ 1

В документации :

SpringApplication будет загружать свойства из файлов application.properties (или application.yml) в следующих местах и ​​добавлять их в Spring Environment:

  • A /config подкаталог текущего каталога.
  • Текущий каталог
  • Пакет classpath /config
  • Путь к корню класса

Если вам не нравится application.properties в качестве имени файла конфигурации, вы можете переключиться на другой, указав свойство среды spring.config.name. Вы также можете обратиться к явному местоположению, используя свойство среды spring.config.location (список разделов, разделенных запятыми, или пути к файлам).

Всегда используется путь поиска по умолчанию classpath:,classpath:/config,file:,file:config/, независимо от значения spring.config.location. Этот путь поиска упорядочен с самого низкого приоритета (file:config/ выигрывает). Если вы указываете свои собственные местоположения, они имеют приоритет над всеми местоположениями по умолчанию и используют один и тот же порядок с самым низким и высоким приоритетом. Таким образом, вы можете настроить значения по умолчанию для своего приложения в application.properties (или любом другом базовом имени, которое вы выбрали с помощью spring.config.name), и переопределить его во время выполнения с другим файлом, сохраняя значения по умолчанию.

Вам нужно указать аргумент командной строки, который сообщает SpringApplication, где конкретно искать. Если все в resources/ добавлено в корневой путь к классу, ваша команда будет выглядеть так:

java -jar myproject.jar --spring.config.location=classpath:/env-config/service-config.yml

Если в разделе resources/ есть общий application.yml, свойства там все равно будут загружены, но будут иметь более низкий приоритет в файле свойств, указанном в командной строке.

Ответ 2

В вашем вопросе не сказано, что вы собираетесь делать, но если вы хотите иметь другую конфигурацию для разных сред (например, development, test, production), для этого есть простое решение.

Поместите свои файлы конфигурации в иерархию файлов, например, внутри вашего проекта:

src/
  main/
    resources/
      application.yml
      application-development.yml
      application-test.yml
      application-production.yml

Когда вы начинаете свое приложение с

java -jar mySpringApplication.jar -Dspring.profiles.active=development

конфигурация из application.yml будет приниматься как "базовый уровень", переопределенная конфигурацией в application-development.yml. Таким образом, вы можете иметь настройки "по умолчанию" для всех сред в application.yml и конфигурацию, специфичную для среды, в файлах application-ENV.yml. То же самое работает для test и production.

Ответ 3

Нет.

Вы окажетесь в гораздо лучшем положении, если вы избегаете путь к файлу жесткого кодирования, как в вашей базе кода. @ConfigurationProperties используется для атрибута locations, но он устарел и уже удален в 1.5.

В Spring Boot вы настраиваете Environment, который является единственным источником правды для вашей конфигурации. Вместо того, чтобы иметь настройки, закодированные в коде, вы должны настроить Spring Boot для чтения файлов, которые вы хотите. Прочитайте документацию для spring.config.location. Если вы хотите сделать это более прозрачно, возможно, EnvironmentPostProcessor - это то, что вам нужно