标签: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中的
---------------------------------------------------------------------------------------------------------------------------
标签:gis handle map load pre obj 扫描 属性 boot
原文地址:https://www.cnblogs.com/chuliang/p/11706680.html