Как создать собственный 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 который ничего не знает о форматах файлов.

Другие вопросы по тегам