【16】Contract 创建方法元数据(MethodMetadata)源码分析
文章目录
- 前言
- MethodMetadata
- Contract 接口及其实现类
- 加载流程源码解析
-
-
- 进入动态代理
-
-
- 进入 解析
前言
在之前,我们了解到Feign 基于接口声明,生成执行请求的动态代理对象,那么究竟是如何将接口上的注解等信息,解析的呢?这里就必须了解Feign 中非常重要的一个接口Contract。
Contract意为契约,实际就是Feign 中的接口解析器,会解析接口方法上的注解为元数据,以此来创建请求模板及方法执行器。
MethodMetadata
MethodMetadata意为方法元数据,可以理解为一个Java Bean,Feign 会解析接口的每个方法,封装为MethodMetadata,并依据这个创建方法处理器。
// 键名=》OrderFeign#post(Order)
private String configKey;
// 方法返回类型=》Order
private transient Type returnType;
// 请求url位置
private Integer urlIndex;
// 请求体位置
private Integer bodyIndex;
// 消息头位置
private Integer headerMapIndex;
// queryMap位置
private Integer queryMapIndex;
private boolean queryMapEncoded;
// 请求体类型
private transient Type bodyType;
// 请求模板
private final RequestTemplate template = new RequestTemplate();
private final List<String> formParams = new ArrayList();
private final Map<Integer, Collection<String>> indexToName = new LinkedHashMap();
private final Map<Integer, Class<? extends Expander>> indexToExpanderClass = new LinkedHashMap();
private final Map<Integer, Boolean> indexToEncoded = new LinkedHashMap();
private transient Map<Integer, Expander> indexToExpander;
private BitSet parameterToIgnore = new BitSet();
// 是否忽略该方法
private boolean ignored;
// 需要代理的接口类型
private transient Class<?> targetType;
// 接口中的方法 =》public abstract pojo.Order account.OrderFeign.post(pojo.Order)
private transient Method method;
// 警告级别
private final transient List<String> warnings = new ArrayList();