gpt4 book ai didi

spring - PropertiesFactoryBean 可以从 application.yml 读取值吗?

转载 作者:行者123 更新时间:2023-12-01 01:02:56 27 4
gpt4 key购买 nike

我的项目有一个依赖项,它需要设置一个可由@Value 注释读取的属性对象:

@Value("#{myProps['property.1']}")

要在 JavaConfig 中执行此操作,我使用以下内容:
@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 - PropertiesFactoryBean 可以从 application.yml 读取值吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21533679/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com