我正在尝试将 spring-cloud 堆栈用于将使用 Zuul 的项目。在我的组织中,我们有一个基于 xml 的自定义配置堆栈,它执行属性组合和分层覆盖。由于此配置的处理方式,我一直在努力为其创建 PropertySource。
我的自定义 PropertySource 必须使用我的 Config bean,但是因为 PropertySources 在 spring boot 的引导过程中被初始化,所以应用程序上下文还没有完全初始化,我无法访问我的自定义 Bean,它公开了我们基于 xml 的配置系统。
@ConfigurationProperties 似乎完全偏向于 .properties 和 .yaml 文件。 Config bean 在 ApplicationContextInitializer 中初始化。有没有一种方法可以延迟各种服务中 ConfigurationProperties 的解析,以便我可以在初始化后使用我的 Config bean 构建我的自定义属性源?
最佳答案
我最初尝试(在提出问题之前)在我的配置中创建一个自定义 PropertySourceLocator(如 Dave Syer 所提到的,并在他提供的链接中有详细记录)并使用我自己的 spring.factories 注册它(同样,在Spencer Gibb 在评论中给出的有用链接。)问题是我的属性源需要在 ApplicationContextInitializer 中完成一些工作之后进行配置,并且属性源似乎都在这之前得到解决(至少那些连接的作为 org.springframework.cloud.bootstrap.BootstrapConfiguration 的工厂)。我想我是通过说明我需要我的 PropertySource 中的一个特定 bean 来暗示这一点的,我当时无法从 ApplicationContext 中获取它。
无论如何,为了解决这个问题,我现在在 PriorityOrdered ApplicationContextInitializer 中注册属性源,以便在另一个初始化我的配置对象之后发生。类似于:context.getEnvironment().getPropertySources().addFirst(myPropertySource);
这似乎让我的属性源在正确的时间进入环境,并允许我根据需要事先对上下文进行自定义。
关于java - 如何创建依赖于 Spring Bean 的自定义 Spring PropertySource,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29037507/