>更新:我刚刚也在这里发布了这个问题,我可能在那里做了更好的措辞。
我如何明确定义一个顺序,其中 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) {
...
}
}
现在,我使用添加到执行行的-Dzookeeper.url
将zookeeper.url
传递到已执行的程序中。现在我通过直接致电System.getProperty("zookeeper.url")
来阅读它。
由于我使用的是 Spring-Boot 应用程序,所以我还有一个application.yml
配置文件。
我希望能够在application.yml
中设置zookeeper.url
,并从显式属性中尽可能保持我的执行行干净。
事实证明,这项任务比我想象的要难。
正如您在上面的代码截图中看到的 ZookeeperConfigurationReader
,我正在尝试使用 @Value("${zookeeper.url}")
将该值注入到类中执行从 zookeeper 实际读取数据的成员中,但在需要该值的代码访问它时,它仍然是空的。原因是在 spring 生命周期方面,我仍处于"配置"阶段,因为我自己是一个@Configuration
注释类,并且读取 application.yml 数据并将其作为系统属性放置的 spring 代码尚未执行。
所以底线,我正在寻找一种控制顺序并告诉 spring 首先将application.yml
读入系统属性,然后加载ZookeeperConfigurationReader
类的方法。
你可以尝试使用Spring Cloud Zookeeper。我在这里发布了一个简短的使用示例