Я пытаюсь разделить параметры конфигурации для нескольких приложений загрузки Spring. Я использую Spring Boot 1.1.6, а наши свойства конфигурации выражаются в YAML в обычном стиле application.yml. Я создал различные профили для общих базовых параметров, общих параметров БД и т.д. Я пытался использовать функцию include, упомянутую в Spring Документах загрузки Boot, но, похоже, работает как переопределение, а не include. То есть прямо противоположное тому, что я хочу. Учитывая следующий контент в application.yml, я бы предположил, что свойство name имеет значение bar, когда профиль bar активен, но вместо этого он получает значение foo (из включенного профиля). Я думал, что понятие включения означает, что оно было загружено первым, и любые идентично названные свойства, установленные в новом профиле, будут переопределять те из включенного профиля. Например, если подкласс затеняет поле из суперкласса, любой экземпляр подкласса будет отображать затененное значение. Здесь файл:
spring:
profiles: foo
name: foo
--- # New YAML doc starts here
spring:
profiles:
include: foo
profiles: bar
name: bar
Если я запустил это в тестовом примере с явно активированным профилем "bar", свойство имя все равно будет foo:
SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
SpringApplication app = builder.application();
builder.profiles("bar");
ConfigurableApplicationContext ctxt = app.run();
String name = ctxt.getEnvironment().getProperty("name"); // Is always "foo" much to my surprise
Однако, если я прокомментирую, включите:
spring:
profiles: bar
# profiles:
# include: foo
и активировать два профиля в моем коде:
builder.profiles("foo", "bar");
Затем он работает так, как я ожидал, и для свойства name установлено значение бар. Основная причина, по которой я предпочитаю обрабатывать включенные в файлы YAML, заключается в том, что она оказывает меньшее влияние на мой фактический код, и я могу управлять включением всех профилей в одном месте. С другим подходом мне пришлось бы искать строки профиля и возможные аннотации @Profile во всем моем проекте, если бы я когда-либо переименовал профили. Это определенно больше подвержено ошибкам. Я думаю, что более гибкое решение заключалось бы в явном выражении того, включит ли включенный профиль переопределенные значения подпрофиля или нет. Может быть, что-то вроде:
spring:
profiles: bar
profiles:
include: foo
override: false
Возможно, я просто что-то пропустил. Есть ли лучший способ сделать это? Благодарю.