同一应用程序中的两个环境

时间:2019-03-07 08:09:09

标签: spring-boot

是否可以为不同的配置文件构建环境(具有中继的属性源)?

例如:当应用程序以产品配置文件运行时,我希望开发者配置文件具有配置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();

它可以工作,但是有很多缺点:验证不起作用,手动设置属性来源...

1 个答案:

答案 0 :(得分:1)

是的,您可以按照以下步骤设置多个活动配置文件:

spring.prifiles.active:
- prod
- dev

使用这种方法,将初始化用@Profiles("prod")@Profiles("dev")定义的所有bean。请注意,不应有任何模糊的be​​an定义。


如果您只想将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个键(devprod)的地图。我个人觉得它有点难看,但应该可以解决您的问题。