5

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

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

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

4

2 回答 2

7

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

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

于 2015-03-13T17:01:14.783 回答
7

我最初尝试(在提出问题之前)在我的配置中创建一个自定义 PropertySourceLocator(如 Dave Syer 所述,并在他提供的链接中有详细记录)并将其注册到我自己的 spring.factories (再次,在有用的链接中演示Spencer Gibb 在评论中给出。)问题是我的属性源需要在 ApplicationContextInitializer 中完成一些工作之后进行配置,并且属性源似乎在此之前都已解决(至少那些作为工厂连接的)对于 org.springframework.cloud.bootstrap.BootstrapConfiguration)。我想我暗示我在我的 PropertySource 中需要一个我当时无法从 ApplicationContext 获得的特定 bean。

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

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

于 2015-03-13T19:53:23.767 回答