spring-PropertiesFactoryBean可以从application.yml读取值吗?
作者:互联网
我的项目具有一个依赖项,该依赖项需要一个可通过@Value批注读取的属性对象集:
@Value("#{myProps['property.1']}")
为此,我正在使用以下命令:
@Bean(name="myProps")
public static PropertiesFactoryBean mapper() {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("myprops.properties"));
return bean;
}
这按预期工作.我的属性如下所示:
property.1=http://localhost/foo/bar
property.2=http://localhost/bar/baz
property.3=http://localhost/foo/baz
我正在为此项目使用Spring Boot,因此,我希望能够执行以下操作:
myprops.properties:
property.1=${base.url}/foo/bar
property.2=${base.url}/bar/baz
property.3=${base.url}/foo/baz
然后,我可以基于不同的配置文件配置base.url.
application.yml:
base:
url: http://localhost
---
spring:
profiles: staging
base:
url: http://staging
---
spring:
profiles: production
base:
url: http://production
我已经尝试这样做,但是它不起作用.解决方法是,我创建了三个不同的.properties文件(myprops.properties,myprops-staging.properties等),并使用三个不同的@Configuration类加载了它们.这可行,但看起来很麻烦.
@Configuration
public class DefaultConfiguration {
@Bean(name="myProps")
public static PropertiesFactoryBean mapper() {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("myprops.properties"));
return bean;
}
}
@Configuration
@Profile("staging")
public class StagingConfiguration {
@Bean(name="myProps")
public static PropertiesFactoryBean mapper() {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("myprops-staging.properties"));
return bean;
}
}
@Configuration
@Profile("production")
public class ProductionConfiguration {
@Bean(name="myProps")
public static PropertiesFactoryBean mapper() {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("myprops-production.properties"));
return bean;
}
}
是否可以将我的PropertiesFactoryBean配置为从application.yml读取值?如果不是,是否有更简单的方法来使用JavaConfig配置属性?
解决方法:
我最终以编程方式完成了此操作,它使我可以找到想要的行为:
@Value("${base.url}")
private String baseUrl;
@Bean(name = "myProps")
public PropertiesFactoryBean mapper() throws IOException {
PropertiesFactoryBean bean = new PropertiesFactoryBean();
bean.setLocation(new ClassPathResource("myprops.properties"));
bean.afterPropertiesSet();
// replace ${base.url} in values
Properties props = bean.getObject();
Enumeration names = props.propertyNames();
while (names.hasMoreElements()) {
String name = names.nextElement().toString();
String value = props.getProperty(name);
if (value.contains("${base.url}")) {
props.setProperty(name, value.replace("${base.url}", baseUrl));
}
}
bean.setLocalOverride(true);
bean.setProperties(props);
bean.afterPropertiesSet();
if (log.isDebugEnabled()) {
log.debug("Base URL: " + baseUrl);
}
return bean;
}
标签:spring-java-config,spring-boot,spring 来源: https://codeday.me/bug/20191122/2057544.html