如何明确定义Spring从类可用路径application.yml中读取属性的开箱即用过程的顺序

时间:2015-04-05 14:28:44

标签: spring configuration yaml

更新:我刚刚发布了这个问题here,我可能在那里做了更好的工作。

如何明确定义Spring在我的application.yml注释类之前从类似路径@Configuration中读取属性的开箱即用过程的顺序从zookeeper读取配置数据并将它们作为系统属性放置,以后可以使用@Value轻松读取并注入成员?

我有一个@Configuration类,它定义了@Bean的创建,其中来自zookeeper的配置数据被读取并作为系统属性放置,以便于它们可以轻松读取和使用@Value注入成员。

@Profile("prod")
@Configuration
public class ZookeeperConfigurationReader {

    @Value("${zookeeper.url}")
    static String zkUrl;

    @Bean
    public static PropertySourcesPlaceholderConfigurer zkPropertySourcesPlaceHolderConfigurer() {
        PropertySourcesConfigurerAdapter propertiesAdapter = new PropertySourcesConfigurerAdapter();
        new ConfigurationBuilder().populateAdapterWithDataFromZk(propertiesAdapter);
        return propertiesAdapter.getConfigurer();
    }

    public void populateAdapterWithDataFromZk(ConfigurerAdapter ca) {
      ...
    }

}

现在我使用添加到执行行的zookeeper.url-Dzookeeper.url传递到已执行的程序中。现在我通过直接致电System.getProperty("zookeeper.url")来阅读它。

由于我使用的是Spring-Boot应用程序,因此我还有一个application.yml配置文件。

我希望能够在zookeeper.url中设置application.yml,并尽可能保持我的执行行与显式属性一致。

任务结果比我想象的更难。

正如您在ZookeeperConfigurationReader的上述代码片段中所看到的,我正在尝试使用@Value("${zookeeper.url}")将该值注入类中的成员,该成员执行从zookeeper实际读取的数据,但是在需要该值的代码访问它时,它仍然为null。原因在于,在Spring生命周期中,我仍然处于“配置”阶段,因为我自己是一个@Configuration注释类,而spring的代码读取了application.yml数据和地方它们作为系统属性尚未执行。

所以底线,我正在寻找的是一种控制顺序的方法,并告诉spring先将application.yml读入系统属性,然后加载ZookeeperConfigurationReader类。

1 个答案:

答案 0 :(得分:0)

您可以尝试使用Spring Cloud Zookeeper。我发布了一个使用here

的简短示例