更新:我刚刚发布了这个问题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
类。