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