如何在 Web 应用程序中初始化 bean 之前从 zookeeper 将属性加载到环境中

How to load properties into environment from zookeeper before initialising beans in web application

基于

Spring 的 Web 应用程序: 现有:上下文是从文件 ("web.xml") 加载的,应用程序所需的属性正在从 xml 上下文文件中引用的属性文件中加载。

新:现在应该从 zookeeper 中读取属性(连同属性文件)。读取属性所需的 java 代码是使用 ZookeeperPropertySource

完成的

问题:我需要在哪里插入 java 代码,以便随着应用程序上下文的初始化从 zookeeper 加载属性?

我无法使用 ApplicationEventListener(因为 ContextStartedEvent 不会自动触发)和 BeanFactoryPostProcessor(环境不可用于绑定属性)实现此目的

解决方案:
创建一个新的 class 扩展 "ContextLoaderListener" class 并覆盖方法 "WebApplicationContext createWebApplicationContext(ServletContext sc)"。由于 WebApplicationContext 将在此处可用,因此可以将 ZookeeperPropertySource 设置为环境。

示例代码:

@Override
protected WebApplicationContext createWebApplicationContext(ServletContext servletContext) {
    WebApplicationContext webApplicationContext = super.createWebApplicationContext(servletContext);
    loadZookeeperPropertySource(webApplicationContext.getEnvironment());
    return webApplicationContext;
}

loadZookeeperPropertySource(Environment environment) 是一种使用 ZookeeperPropertySourceLocator 从 zookeeper 加载属性源并设置为环境的方法