SpringCloudfeign的配置加载

摘要:
@AliasFor(“value”)Stringname()默认值“”;}Stringvalue=(字符串)client.get(“contextId”);StringUtils.hasText(value)){value=(String)client.get(“serviceId”);

     spring cloud feign我们使用 @FeignClient注解,其中有几个核心属性:

@AliasFor("name")
String value() default "";

@Deprecated
String serviceId() default "";

/**
 * This will be used as the bean name instead of name if present, but will not be used as a service id.这个注释我理解的似乎有点问题,不知道理解的对不对
 */
String contextId() default "";

@AliasFor("value")
String name() default "";

String qualifier() default "";

  

spring会用FeignClientsRegistrar这个类注册当前client,其中有一个很重要的属性就是clientName,因为clientName会影响到我们配置该client,clientName的定义看下面代码,可以看到contextId的优先级最高,当你定义了contextId后clientName取的就是contextId。


org.springframework.cloud.openfeign.FeignClientsRegistrar.getClientName
private String getClientName(Map<String, Object> client) {
   if (client == null) {
      return null;
   }
   String value = (String) client.get("contextId");//可以看到contextId的优先级最高>value>name>serviceId
   if (!StringUtils.hasText(value)) {
      value = (String) client.get("value");
   }
   if (!StringUtils.hasText(value)) {
      value = (String) client.get("name");
   }
   if (!StringUtils.hasText(value)) {
      value = (String) client.get("serviceId");
   }
   if (StringUtils.hasText(value)) {
      return value;
   }

   throw new IllegalStateException("Either 'name' or 'value' must be provided in @"
         + FeignClient.class.getSimpleName());
}

其中有一个很容易搞错的问题,就是client beanName(区别于clientName),首先看出qualifier的级别最高,如果没有定义qualifier但定义了contextId后实际的bean名称是contextId+"FeignClient"


org.springframework.cloud.openfeign.FeignClientsRegistrar.registerFeignClient
String alias = contextId + "FeignClient";//拼接了FeignClient
AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();

boolean primary = (Boolean)attributes.get("primary"); // has a default, won't be null

beanDefinition.setPrimary(primary);

String qualifier = getQualifier(attributes);
if (StringUtils.hasText(qualifier)) {//如果有qualifier就用qualifier
   alias = qualifier;
}

但是FeignClient注解contextId源码中的注释 This will be used as the bean name instead of name if present, but will not be used as a service id.我理解起来这个注释有点问题 

spring cloud feign的配置都是基于clientName来识别的,例如

   feign.client.clientName.connect-timeout=100

相关配置会被装载到FeignClientProperties,其中支持配置的属性如图

SpringCloudfeign的配置加载第1张

 最终通过FeignClientFactoryBean将FeignClientProperties中相应client的配置装配到feignclient中,核心方法为

org.springframework.cloud.openfeign.FeignClientFactoryBean.configureFeign

protected void configureFeign(FeignContext context, Feign.Builder builder) {
   FeignClientProperties properties = applicationContext.getBean(FeignClientProperties.class);
   if (properties != null) {
      if (properties.isDefaultToProperties()) {
          //三种配置依次装载
         configureUsingConfiguration(context, builder);//先配置Java代码中的配置
         configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()), builder);//配置文件中的默认配置
         configureUsingProperties(properties.getConfig().get(this.contextId), builder);//配置了clientName的配置
      } else {
         configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()), builder);
         configureUsingProperties(properties.getConfig().get(this.contextId), builder);
         configureUsingConfiguration(context, builder);
      }
   } else {
      configureUsingConfiguration(context, builder);
   }
}

  

 

免责声明:文章转载自《SpringCloudfeign的配置加载》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows,Linux的select函数功能差异linux设置执行的命令写入日志下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

centos中网卡的配置

配置临时IP: ip a a 192.168.59.100/24 dev ens32 ifconfig ens32 192.168.59.100 up  在Linux最小安装之后,一般需要手动配置网络地址。 初始化界面: 一、简单的利用DHCP获取 1、进入网卡配置文件  1 cd /etc/sysconfig/network-scripts/  2、...

关于apache 虚拟主机配置访问403的问题

 <Directory />    Options FollowSymLinks    Order allow,deny    Allow from all</Directory>各位 如果httpd.conf里面的这个配置已经改成上面这样了 但是我配置的下面的虚拟主机还是访问403是怎么回事呢?已经百度过了 全部都是一样的结果就是...

Intellj Idea使用tomcat部署不成功,死活也找不到解决办法的看这里

Intellij 周六晚上开发一个简单web项目的,使用tomcat打包部署,死活也没法部署成功,和这个问题怼了6个小时,也没搞清楚具体为什么不能访问页面,但是好在最后还是找了个方法把问题解决了。以下是问题的一些问题的描述和解决办法,如果你也遇到了相似问题,希望可以给你帮助: 问题描述: 1:部署看起来是成功的,启动的时候控制台不报任何错误,显示的是应用启...

InfluxDB 安装以及使用

InfluxDB InfluxDB简介:       InfluxDB 是一个开源分布式时序、事件和指标数据库。使用Go语言编写,无需外部依赖。其设计目标是实现分布式和水平伸缩扩展。        它有三大特性:        1. Time Series (时间序列):你可以使用与时间有关的相关函数(如最大,最小,求和等);        2. Metr...

辅助模式最终考验的是想象力,先来看看怎么用!| Accessibility

一、序 Hi,大家好,我是承香墨影! Android 的辅助模式(Accessibility)功能非常的强大。基本上被获取到授权之后,可以监听手机上的任何事件,例如:屏幕点击、窗口的变化、以及模拟点击、模拟系统按键等等。 比较常见的实际使用例子,就是一般应用市场,会推荐开启辅助模式,以便在安装 Apk 的时候,自动帮你点击“下一步”和“安装”按钮。还有个...

记一次读取json配置文件,引发的堆栈溢出

读取配置文件的原代码 /// <summary> /// 获取配置 /// </summary> /// <param name="JsonFileName">json文件路径</param> /// <returns></re...