首先需要在启动类加注解@EnableFeignClients,它的代码如下:
可以看到,@EnableFeignClients导入了FeignClientRegistra类,它实现了ImportBeanDefinitionRegistrar,其中定义了注册bean的逻辑
其中registerFeignClients用于注册我们通过@FeignClient注解标记的接口,这个方法代码如下:
这个方法中会查找带@FeignClient注解的类,然后调用registerFeignClient方法来注册bean,registerFeignClient代码如下:
其中注册的时候使用了FeignClientFactoryBean的信息来创建BeanDefinition.这个工厂bean的getObject方法如下:
其中调用的getTarget方法代码如下:
其中调用了target方法,target方法代码如下:
其中调用的target方法的代码如下:
其中调用的newInstance的代码如下:
从上图可以看到,FeignClientFactoryBean真正返回的是一个jdk动态代理对象,它的InvocationHandler类(FeignInvocationHandler)的invoke代码如下: