【发布时间】:2019-01-02 12:46:22
【问题描述】:
当在spring.factories 文件中声明初始化器以创建 Spring Boot 启动器时,我们意识到这些初始化器被加载了两次:
- 曾经由 Spring Cloud Boostrap 上下文提供
- Spring Boot 上下文中一次
在我们的例子中,我们在 docker 容器中启动数据库,所以我们不想做两次。
根据这个问题,这是 Spring Cloud 的预期行为:https://github.com/spring-cloud/spring-cloud-config/issues/1151
当询问如何将 boostrap 上下文与“常规”应用程序上下文区分开来时,给出的答案是
检查上下文的 ID。
运行示例应用程序后,ConfigurableApplicationContext.getId() 默认返回:
-
application用于 Spring Cloud Bootstrap 上下文 -
application-1用于 Spring Boot 上下文
我们的一些用户没有定义spring.application.name,其他用户根本不使用 Spring Cloud。
问题:我们如何才能可靠地只加载一次初始化程序?
如果ApplicationContextInitializers 是幂等的,它可能应该出现在接口的 Javadocs 中。
在最坏的情况下,我们如何安全地区分 Spring Cloud boostrap 上下文和 Spring Boot 上下文?
【问题讨论】: