При объявлении инициализаторов в файле spring.factories
для создания стартеров Spring Boot мы поняли, что эти инициализаторы были загружены дважды:
- один раз в контексте Boostrap Spring Cloud
- один раз вконтекст Spring Boot
В нашем случае мы запускаем базы данных в Docker-контейнерах, поэтому мы не хотим делать это дважды.
В соответствии с этой проблемой это Spring Cloudожидаемое поведение: https://github.com/spring-cloud/spring-cloud-config/issues/1151
На вопрос, как следует отличать контекст boostrap от «обычного» контекста приложения, вы получите ответ:
Проверьте идентификатор контекста.
После запуска примера приложения по умолчанию возвращается ConfigurableApplicationContext.getId()
:
application
для контекста начальной загрузки Spring Cloud application-1
дляконтекст Spring Boot
Некоторые из наших пользователей не определяют spring.application.name
, другие вообще не используют Spring Cloud.
Вопрос : Какмы можем надежно загрузить инициализатор только один раз?
Если ApplicationContextInitializer
s предназначены для идемпотентности, это, вероятно, должно фигурировать в Javadocs интерфейса.
В худшем случае, как мы можем безопасно отличить контекст надстройки Spring Cloud от SpringКонтекст загрузки?