我使用spring-cloud-config和spring-cloud-bus创建了一个简单的项目。出于某种原因,配置客户端调用两次配置服务器。第一次发生在创建引导程序的上下文(预期行为是什么)时,但是第二次在创建活页夹的上下文时调用。
这在课堂上完成:
DefaultBinderFactory#getBinderInstance:
// If the environment is not customized and a main context is available, we
// will set the latter as parent.
// This ensures that the defaults and user-defined customizations (e.g. custom
// connection factory beans)
// are propagated to the binder context. If the environment is customized,
// then the binder context should
// not inherit any beans from the parent
boolean useApplicationContextAsParent = binderProperties.isEmpty() && this.context != null;
if (useApplicationContextAsParent) {
springApplicationBuilder.parent(this.context);
}
if (useApplicationContextAsParent || (environment != null && binderConfiguration.isInheritEnvironment())) {
if (environment != null) {
StandardEnvironment binderEnvironment = new StandardEnvironment();
binderEnvironment.merge(environment);
springApplicationBuilder.environment(binderEnvironment);
}
}
ConfigurableApplicationContext binderProducingContext = springApplicationBuilder
.run(args.toArray(new String[args.size()]));
何时执行以下声明:
ConfigurableApplicationContext binderProducingContext = springApplicationBuilder
.run(args.toArray(new String[args.size()]));
据我在代码中看到,绑定器的上下文与应用程序的上下文不同。似乎再次调用配置服务器的原因是spring-cloud-context使用由侦听器 BootstrapApplicationListener 加载的初始化器 PropertySourceBootstrapConfiguration 创建其上下文。
所以,我的问题是:这是预期的行为吗?我假设配置客户端在启动时应该只向服务器发出一个请求。如果不正确,为什么会这样呢?
我使用的版本包含在: spring-cloud-dependencies,版本Edgware.RELEASE
非常感谢提前!
答案 0 :(得分:1)
是;它的预期; spring cloud stream binder被加载到它自己的Spring Boot应用程序中(它可以有不同的环境变量)。