码迷,mamicode.com
首页 > 其他好文 > 详细

Feign源码

时间:2019-10-20 10:55:11      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:gis   handle   map   load   pre   obj   扫描   属性   boot   

Feign的作用是根据接口生成发起请求并处理结果的代理类。是链接ribbon和Hystrix的中介。
---------------------------------------------------------------------------------------------------------------------------
@EnableFeignClients注解其实是@Import(FeignClientsRegistrar.class),根据SpringBoot注册bean的逻辑,由于FeignClientsRegistrar是一个ImportBeanDefinitionRegistrar,调用其registerBeanDefinitions方法,
里面有两个方法,registerDefaultConfiguration和registerFeignClients,
前者是向工厂注册@EnableFeignClients的defaultConfiguration属性的值,封装成FeignClientSpecification。
后者是注册@FeignClient注解类。逻辑是:
先找到@EnableFeignClients注解中的clients值
再合并EnableFeignClients注解中的value、basePackage、basePackageClasses等属性对应的值(如果都为空,取@EnableFeignClients注解的类的包路径),当作扫描路径,扫描@FeignClient注解的接口。
生成一个FactoryBean---FeignClientFactoryBean的beanDefinition进行注册。
---------------------------------------------------------------------------------------------------------------------------
beanDefinition实例化的时候,getBean方法中getObjectForBeanInstance方法会判断,如果bean如果是FactoryBean,实际返回的bean是FactoryBean的getObject方法的返回值,进入方法,看到判断this.url是不是为空,我们
用注册中心的话一般是不会写定url而是用服务名,所以进入判断,进入loadBalance方法,一直走下去,调用的是Feign的内部类Builder的的build方法,返回一个ReflectiveFeign,再调用其newInstance方法,
先把FeignClient注解的接口中的method对象和根据method生成的SynchronousMethodHandler关联,再往下就是喜闻乐见的动态代理,其中InvocationHandler是ReflectiveFeign的内部类FeignInvocationHandler,
其invoke方法,是取出method对应的SynchronousMethodHandler的invoke方法。
---------------------------------------------------------------------------------------------------------------------------
1、FeignContext、Targeter在FeignAutoConfiguration中注册
2、FeignContext是一个NamedContextFactory,也就是一个name vs spring工厂的map,实例化的时候,构造函数defaultConfigType=FeignClientsConfiguration,是每一个子工厂
的configuration。
3、FeignClientsConfiguration注册HystrixTargeter/DefaultTargeter、HystrixFeign/Feign.builder,feign.hystrix.enabled就是在这里起作用。这是个封装类,调用的是Feign.Builder的target方法,所以关键还是在Feign.Builder。
4、NamedContextFactory,先注册feignClient注解里configuration的值,再注册默认的defaultFeignClientSpecification,再注册defaultConfigType也就是FeignClientsConfiguration。解析configuration的
时候也是按照这样的顺序,所以自己@feignClient里的可以覆盖@EnableFeignClients里的,然后再覆盖FeignClientsConfiguration中的
---------------------------------------------------------------------------------------------------------------------------

Feign源码

标签:gis   handle   map   load   pre   obj   扫描   属性   boot   

原文地址:https://www.cnblogs.com/chuliang/p/11706680.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!