我有一个弹簧启动项目的库。该库有一个库。yml文件,其中包含用于其配置的Dev和prod Prop:
library.yml
---
spring:
profiles:
active: dev
---
spring:
profiles: dev
env: dev
---
spring:
profiles: prod
env: prod
另一个应用程序使用此库,并使用:
加载道具@Bean
public static PropertySourcesPlaceholderConfigurer dataProperties() {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(new ClassPathResource("library.yml"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
return propertySourcesPlaceholderConfigurer;
}
及其应用程序。
---
spring:
profiles:
active: dev
但是,当我检查Env的价值时,我会得到"产品"。为什么?
如何告诉Spring Boot使用Library.ym中的活动(例如DEV)配置文件道具?
注意:我更喜欢使用.yml代替.properties文件。
默认情况下,PropertySourcesPlaceholderConfigurer
仅对获得配置文件特定道具一无所知。如果您在诸如env
之类的文件中多次定义了支架,则它将绑定与该Prop的最后一次出现相关的值(在这种情况下为prod
)。
使其绑定匹配特定配置文件的道具,请设置配置文件文档匹配器。配置文件匹配器将需要了解可以从环境获得的活动配置文件。这是代码:
@Bean
public static PropertySourcesPlaceholderConfigurer dataProperties(Environment environment) {
PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
SpringProfileDocumentMatcher matcher = new SpringProfileDocumentMatcher();
matcher.addActiveProfiles(environment.getActiveProfiles());
yaml.setDocumentMatchers(matcher);
yaml.setResources(new ClassPathResource("library.yml"));
propertySourcesPlaceholderConfigurer.setProperties(yaml.getObject());
return propertySourcesPlaceholderConfigurer;
}