如何在 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 加载属性源并设置为环境的方法
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 加载属性源并设置为环境的方法