是否可以为不同的配置文件构建环境(具有中继的属性源)?
例如:当应用程序以产品配置文件运行时,我希望开发者配置文件具有配置bean。
我正在使用Spring Boot 2(带有新的Binder API)
感谢您的帮助。
P.S .:我使用相同的配置对象,但具有特定于配置文件的值。
示例: application.yml
spring:
profiles: dev
server:
address: 127.0.0.1
---
spring:
profiles: prod
server:
address: 192.168.1.120
配置bean:
@Component
@ConfigurationProperties("server")
@Validated
public static class ServerConf {
private final InetAddress address;
...
}
主要目标是让ServerConf作为与活动配置文件相关的bean,以及与特定配置文件或与诸如ServerConfProd,ServerConfDev的bean组相关的ServerConf类的对象集
理想情况下,我正在寻找类似于以下内容的东西:
StandardEnvironment env = new StandardEnvironment();
env.setActiveProfiles("prod");
MutablePropertySources propertySources = env.getPropertySources();
propertySources.addLast(new ResourcePropertySource("classpath:application-prod.properties"));
propertySources.addLast(new ResourcePropertySource("classpath:application.properties"));
ServerConf prodServerConf = Binder.get(env).bind("server", Bindable.of(ServerConf.class)).get();
它可以工作,但是有很多缺点:验证不起作用,手动设置属性来源...
答案 0 :(得分:1)
是的,您可以按照以下步骤设置多个活动配置文件:
spring.prifiles.active:
- prod
- dev
使用这种方法,将初始化用@Profiles("prod")
和@Profiles("dev")
定义的所有bean。请注意,不应有任何模糊的bean定义。
如果您只想将prod
设置为活动配置文件,仍然可以告诉Spring包括其他配置文件:
spring.profiles.include:
- dev
- other
有关更多参考,请查看profiles chapter
您的想法行不通:一个属性将覆盖另一个属性。
我会将serverConf.address
作为地图进行处理:
application.yml
spring:
profiles: dev
server:
addresses:
dev: 127.0.0.1
---
spring:
profiles: prod
server:
addresses:
prod: 192.168.1.120
ServerConf.java
@Component
@ConfigurationProperties("server")
@Validated
public class ServerConf {
private final Map<String, InetAddress> addresses = new HashMap<>();
//...
}
通过这种方式,如果您同时激活了两个配置文件,则将获得包含2个键(dev
和prod
)的地图。我个人觉得它有点难看,但应该可以解决您的问题。