Веб-приложение на основе Spring: Существующий: контекст загружается из файла ("web.xml"), а свойства, необходимые для приложения, загружаются из файла свойств, указанного в файле контекста xml.
Новое: теперь свойства должны считываться из zookeeper (вместе с файлом свойств). Необходимый код Java для чтения свойств выполняется с помощью ZookeeperPropertySource.
Проблема: Куда мне нужно вставить код Java, чтобы свойства загружались из zookeeper вместе с инициализацией контекста приложения?
Я не могу добиться этого с помощью ApplicationEventListener (поскольку ContextStartedEvent не запускается автоматически) и BeanFactoryPostProcessor (среда недоступна для привязки свойств)
Решение:
Создайте новый класс, расширяющий класс «ContextLoaderListener», и переопределите метод «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) — это метод, при котором источники свойств загружаются из zookeeper с помощью ZookeeperPropertySourceLocator и устанавливаются в среду.