跳到主要内容

【15】Feign动态代理源码分析

文章目录

  • 前言
  • 核心类
    • Target接口
  • Client
  • FeignContext
  • Feign
  • Targeter
  • 流程分析
      1. 获取对象
    1. 创建上下文、构建者
    1. 创建Target
    1. 生成代理对象
  • 总结

前言

在之前分析了@EnableFeignClients@FeignClient 是如何进行扫描及读取Feign 接口信息的,最后注解上的信息是被加载为BeanDefinition放入了BeanDefinitionRegistry中,接下来就是加载为Bean 对象了,依据下图(来自于百度)Feign 基本原理,分析下Feign 动态代理机制。
 

核心类

Target接口

Target接口封装了feign 客户端接口的一些信息,并提供了将RequestTemplate请求模板转化为实际请求的Request的方法。

public interface Target<T> {


// 接口类型
Class<T> type();
// 客户端名称
String name();
//访问URL
String url();
// 将RequestTemplate 请求模板转化为实际请求的Request
Request apply(RequestTemplate var1);
}

Target接口有两个实现类,EmptyTargetHardCodedTarget

EmptyTarget意为空的目标,其没有URL属性。

HardCodedTarget意为硬编码目标,Feign 中采用的是这个。

Client

Client就是Feign 直接执行请求的接口,可以看到传入了Request请求对象,及一个Options对象(超时配置)。

public interface Client {


//
Response execute(Request var1, Options var2) throws IOException;
}