在引导程序配置之间共享属性

时间:2020-10-14 14:11:26

标签: spring spring-boot spring-cloud

问题:

我有两个库,其目的是从各自的资源中获取属性,并在启动时将其提供给我的应用程序。当前,两个库都将自己的PropertySourceLocator作为其BootstrapConfiguration的一部分。

(如此处https://cloud.spring.io/spring-cloud-static/spring-cloud-commons/1.3.3.RELEASE/multi/multi__spring_cloud_context_application_context_services.html#customizing-bootstrap-property-sources所述)

例如

  • libraryX负责从SourceX获取属性并配置各自的PropertySourceLocator。

  • libraryY负责从SourceY获取属性并配置各自的PropertySourceLocator

这些库在我的bootstrap.yaml上配置。例如

libX.enabled: true
libX.password: ${LIB_X_PASS}

libY.enabled: true
libY.password: ${LIB_Y_PASS}

只要这些库不使用彼此的属性,一切都很好。

不幸的是,在我的情况下,libX应该是$ {LIB_Y_PASS}的来源。

所以bootstrap.yaml现在看起来像这样:

libX.enabled: true
libX.password: ${LIB_X_PASS}

libY.enabled: true
libY.password: ${libX.values.lib_y_pass}

在此配置应用程序中,由于$ {LIB_X_PASS}和$ {libX.values.lib_y_pass}的解析在调用PropertySourceLocator之前就不再启动。

潜在的解决方案:

  1. @PropertySource使用PropertySourceLocator代替libX

@PropertySource中的属性解析发生时,bootstrap.yaml提供的值似乎可用。唯一的问题是,它似乎与项目中的其他application*.yaml / application*.properties文件具有相同的优先级。因此,不可能用libX来覆盖现有属性。 例如

libX.enabled: true
libX.password: ${LIB_X_PASS}

libY.enabled: true
libY.password: ${libX.values.lib_y_pass}
libX.values.lib_y_pass: dummy_password

libY.password将具有dummy_password的值,而不是libX @PropertySource的任何值。可能的原因是,bootstrap.yaml作为propertySource出现在创建的属性源libX之前,并且在解析期间spring从具有该属性的第一个propertySource中选择了值。

  1. 使用org.springframework.boot.env.EnvironmentPostProcessor

我们可以在环境后期处理阶段将libX属性源注入为第一个属性源。 例如

@Override
public void postProcessEnvironment(ConfigurableEnvironment environment,
                                   SpringApplication application) {

    ....
    environment.getPropertySources().addFirst(libxPropertySource);
}

这似乎可以很好地解决问题,并解决了解决方案1中的问题,但是我不知道是否存在尚未发现的隐藏问题。

问题

有没有更好的方法来解决问题?

似乎是: 答:我的情况(当我需要另一个引导程序PropertySourceLocator中的属性时)与PropertySourceLocator的设计背道而驰,在这种情况下,像这样的骇客是唯一的方法。 B)我缺少了一些东西,问题可以用更简单的方法解决。

0 个答案:

没有答案