当在spring.factories文件中声明初始化器以创建starters时,我们意识到这些初始化器被加载了两次:
在我们的例子中,我们在docker容器中启动数据库,所以我们不想做两次。
根据这个问题,这是Spring的预期行为:https://github.com/spring-cloud/spring-cloud-config/issues/1151
当询问引导上下文应该如何与“常规”应用程序上下文区分时,给出的答案是
检查上下文的ID。
运行示例应用程序后,ConfigurableApplicationContext.getId()默认返回:
applicationapplication-1我们的一些用户没有定义spring.application.name,还有一些用户根本不使用Spring。
问题:我们如何才能可靠地加载一个初始化器一次?
如果ApplicationContextInitializer的含义是幂等的,那么它可能会出现在接口的Javadocs中。
在最坏的情况下,我们如何安全地区分Spring引导上下文和Spring上下文?
发布于 2019-01-04 21:11:25
在试图向EnvironmentPostProcessor 这里中注入属性源时,我们遇到了同样的问题。解决方案非常简单,因为您只需要一个静态标志:
public class YourInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext>
{
private static boolean initialized = false;
@Override
public void initialize(ConfigurableApplicationContext applicationContext)
{
if (!initialized) {
//do your things here
initialized = true;
}
}
}引导应用程序上下文总是在常规Spring应用程序上下文之前运行,因此您也可以使用它在正确的位置运行代码。
最后,在BootstrapApplicationListener中实例化引导上下文。从这里,您可以看到spring.application.name属性被设置为spring.cloud.bootstrap.name或bootstrap的值作为后盾。然后将其设置为ContextIdApplicationContextInitializer中应用程序上下文的id。您还可以使用它来确定您的初始化程序在哪个上下文中运行。
https://stackoverflow.com/questions/54006653
复制相似问题