我如何显式定义一个顺序,在该顺序中,Spring 从可用的类路径应用程序中读取属性的开箱即用过程.yml



>更新:我刚刚也在这里发布了这个问题,我可能在那里做了更好的措辞。

我如何明确定义一个顺序,其中 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.urlzookeeper.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。我在这里发布了一个简短的使用示例

相关内容

  • 没有找到相关文章

最新更新