springcloudfeign的原理

编程

文章将会从以下几个问题展示讨论,

1. 什么时候为@FeignClient注解的接口生成代理?

2. Contract 、Encoder、Expander、AnnotatedParameterProcessor之间的关系?

3. 怎么变成具体的请求参数?

3. Feign的请求发送流程

 

feign 

初始化 ==========

EnableFeignClients注解引入 FeignClientsRegistrar.class

FeignClientsRegistrar 实现 ImportBeanDefinitionRegistrar接口,是在容器中动态添加spring bean的类。FeignClientsRegistrar 通过 registerBeanDefinitions 方法的 registerFeignClients(),扫描所有通过@FeignClient注解的接口,并为每个接口 创建一个FeignClientFactoryBean类,注册在spring的 BeanDefinitionRegistry。spring 容器初始化时,FeignClientFactoryBean#getObject 为每个feignClient接口生成代理。

生成代理的时候对契约进行校验。

SpringMvcContract  
    初始化时,toAnnotatedArgumentProcessorMap -> 生成map (Map<Class<? extends Annotation>, AnnotatedParameterProcessor>)

spring 容器初始化时,FeignClientFactoryBean#getObject 为每个feignClient接口生成代理.
生成代理的时候对契约进行校验。


生成代理 ----》

ReflectiveFeign.target()生成。 Target<T> target,记录了 type(feignClient接口类),name(feignClient注解上定义的name),url(注解上定义的URL),

ReflectiveFeign#newInstance生成代理对象。在该方法内,委托给 ParseHandlersByName 类进行解析。ParseHandlersByName负责解析所有方法的注解元数据并创建每个方法对应的methodhandler用于代理对象调用。

MethodMetadata 是接口方法相关的元数据集合,它是由 Contract 进行解析。在spring cloud的oepn feign中,相关的实现是 SpringMvcContract,由它解析spring mvc提供的相关注解。


AnnotatedParameterProcessor 类用于对方法的某个参数进行解析,并标识为何种参数类型。需要对参数类型填入MethodMetadata中,
 private Integer urlIndex;
  private Integer bodyIndex;
  private Integer headerMapIndex;
  private Integer queryMapIndex; 
  
  
 encoder 当为 MethodMetadata formParams().isEmpty()  和   md.bodyIndex() 时使用
 
 Expander feign调用时,对参数进行展开时使用
 
  
 
ParseHandlersByName 对每方法的参数解析完后,将会获取到 List<MethodMetadata> metadata。该列表 RequestTemplate
 
  
  
Encoder 只对 bodyIndex

SpringMvcContract # parseAndValidateMetadata() ==>
    processAnnotationOnClass 解析在接口上的注解;processAnnotationOnMethod 解析在方法上的注解

 

 

 

以上是 springcloudfeign的原理 的全部内容, 来源链接: utcz.com/z/518466.html

回到顶部