Использование двух файлов 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
- это то, что вам нужно