如何创建依赖于Spring Bean的自定义Spring PropertySource

时间:2015-03-13 16:37:59

标签: java spring spring-boot spring-cloud netflix-zuul

我正在尝试将spring-cloud堆栈用于将使用Zuul的项目。在我的组织中,我们有一个基于xml的自定义配置堆栈,并进行属性组合和分层覆盖。由于处理这种配置的方式,我一直在努力为它创建一个PropertySource。

我的自定义PropertySource必须使用我的Config bean,但是因为在Spring Boot引导期间初始化了PropertySources,所以应用程序上下文尚未完全初始化,我无法访问暴露基于xml的配置的自定义Bean系统

@ConfigurationProperties似乎完全偏向于.properties和.yaml文件。 Config bean在ApplicationContextInitializer中初始化。有没有办法在各种服务中延迟ConfigurationProperties的解析,这样我可以在初始化后使用我的Config bean构建我的自定义属性源?

2 个答案:

答案 0 :(得分:5)

我最初尝试(在提出问题之前)在我的配置中创建一个自定义PropertySourceLocator(如Dave Syer所提及并在他给出的链接中有详细记录)并使用我自己的spring.factories注册(再次,在Spencer Gibb在评论中给出的有用链接。)问题是我的属性源需要在ApplicationContextInitializer中完成的一些工作之后进行配置,并且属性源似乎在发生之前就已经解决了(至少那些是有线的)作为org.springframework.cloud.bootstrap.BootstrapConfiguration的工厂。我想我通过声明我需要在PropertySource中使用我当时无法从ApplicationContext获取的特定bean来暗示这一点。

无论如何,为了解决这个问题,我现在正在 PriorityOrdered ApplicationContextInitializer 中注册属性源,以便在另一个初始化我的配置对象之后进行。类似于:context.getEnvironment().getPropertySources().addFirst(myPropertySource);

这似乎使我的属性源在正确的时间进入环境,并允许我根据需要预先定制上下文。

答案 1 :(得分:4)

在Spring Cloud中,您需要注册一些具有BootstrapConfiguration bean的PropertySourceLocator(根据用户指南:http://projects.spring.io/spring-cloud/spring-cloud.html#customizing-bootstrap-property-sources)。它不应该比那更难。

P.S。 @ConfigurationProperties不偏向于.properties和.yaml文件 - 它绑定到对文件格式一无所知的Environment