Как создать собственный Spring PropertySource, который зависит от Spring Bean
Я пытаюсь использовать стек весенних облаков для проекта, который будет использовать Zuul. В моей организации у нас есть пользовательский стек конфигурации, основанный на xml, который создает композицию свойств и иерархические переопределения. Из-за способа обработки этой конфигурации я изо всех сил пытался создать для нее PropertySource.
Мой пользовательский PropertySource должен использовать мой bean-компонент Config, но поскольку PropertySources инициализируется во время начальной загрузки при весенней загрузке, контекст приложения еще не полностью инициализирован, и я не могу добраться до своего пользовательского Bean-компонента, который предоставляет нашу систему конфигурации на основе xml.
@ConfigurationProperties, похоже, полностью склонен к файлам.properties и.yaml. Бин Config инициализируется в ApplicationContextInitializer. Есть ли способ отложить разрешение свойств ConfigurationProperties в различных службах, чтобы я мог создать свой собственный источник свойств с помощью bean-компонента Config после его инициализации?
2 ответа
Первоначально я попытался (задолго до того, как задавать вопрос) создать собственный PropertySourceLocator в моей конфигурации (как упомянуто Дейвом Сайером и хорошо задокументировано в приведенной им ссылке) и зарегистрировать его в моих собственных spring.factories (опять же, продемонстрировано в полезной ссылке). предоставлено Спенсером Гиббом в комментарии.) Проблема в том, что мой источник свойства должен быть настроен после некоторой работы, которая выполняется в ApplicationContextInitializer, и источники свойств, кажется, все решены до того, как это произойдет (по крайней мере, те, которые подключены как фабрика). для org.springframework.cloud.bootstrap.BootstrapConfiguration). Думаю, я намекнул на это, заявив, что мне нужен конкретный компонент в моем PropertySource, который я не мог получить из ApplicationContext в то время.
В любом случае, чтобы обойти это, я теперь регистрирую источник свойства в PriorityOrdered ApplicationContextInitializer, чтобы иметь место после другого, который инициализирует мой объект конфигурации. Что-то вроде: context.getEnvironment().getPropertySources().addFirst(myPropertySource);
Похоже, что это приводит к тому, что источник моего свойства попадает в среду в нужное время и позволяет мне при необходимости настраивать контекст заранее.
В Spring Cloud вам нужно будет зарегистрировать некоторые BootstrapConfiguration
(согласно руководству пользователя: http://projects.spring.io/spring-cloud/spring-cloud.html) с PropertySourceLocator
боб. Это не должно быть сложнее, чем это.
PS @ConfigurationProperties
не склонен к файлам.properties и.yaml - он привязывается к Environment
который ничего не знает о форматах файлов.