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

How to create a custom Spring PropertySource that depends on a Spring Bean

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

我的自定义 PropertySource 必须使用我的 Config bean,但是因为 PropertySources 在 spring 启动的引导过程中被初始化,所以应用程序上下文还没有完全初始化,我无法访问我的自定义 Bean公开我们基于 xml 的配置系统。

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

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

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

我最初尝试(在提出问题之前)在我的配置中创建一个自定义 PropertySourceLocator(正如 Dave Syer 所提到的,并在他提供的 link 中有详细记录)并使用我自己的 spring.factories(同样,在 Spencer Gibb 在评论中给出的有用 link 中进行了演示。)问题是我的 属性 源需要在 ApplicationContextInitializer 和属性 源似乎都在此之前得到解决(至少那些作为 org.springframework.cloud.bootstrap.BootstrapConfiguration 的工厂连接的)。我想我是通过说明我在我的 PropertySource 中需要一个我当时无法从 ApplicationContext 获得的特定 bean 来暗示这一点的。

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

这似乎让我的 属性 源在正确的时间进入环境,并允许我根据需要事先对上下文进行自定义。