【发布时间】:2015-08-12 15:49:25
【问题描述】:
@RibbonClients 注释允许我们自定义每个客户端的功能区配置。这个过程在http://projects.spring.io/spring-cloud/spring-cloud.html#_customizing_the_ribbon_client的文档中描述
这一切都很好。我尝试使用相同的方法来覆盖应该应用于我所有客户端的 default 配置。所以我定义了以下配置类,并确保它被组件扫描考虑:
@Configuration
@RibbonClients(defaultConfiguration = MyDefaultRibbonConfig.class)
public class MyRibbonAutoConfiguration {
}
不幸的是,在构建功能区客户端的应用程序上下文时,没有考虑到MyDefaultRibbonConfig。在RibbonClientConfigurationRegistrar 的快速查看和跟踪让我认为我的@RibbonClients(default=...) 注释被org.springframework.cloud.netflix.ribbon.eureka.RibbonEurekaAutoConfiguration 提供的注释无条件地覆盖。
但是,如果 @RibbonClients 注释设置在内部类而不是顶级类上,则它可以工作:
@Configuration
public class MyRibbonAutoConfiguration {
@Configuration
@RibbonClients(defaultConfiguration = MyDefaultRibbonConfig.class)
static class SubConfig {
}
}
这是RibbonClientConfigurationRegistrar 为发现的配置bean 命名的策略的副作用:
registerClientConfiguration(registry,
"default." + metadata.getEnclosingClassName(),
attrs.get("defaultConfiguration"));
然后,在顶级类上声明的注释配置使用设置为 default.null.defaultConfiguration 的 bean 名称注册 - 因此下一个会覆盖前一个(但不确定顺序是否可预测)。
我觉得这种行为很奇怪。我错过了什么?我应该采取不同的方式吗?
【问题讨论】:
标签: spring-cloud