1. OpenFeign源码解析之Feign注册

75 阅读1分钟

整体流程图

7a2e620eaf4637816d120a341a28233.png

1.通过注解中加载的FeignClientsRegistrar类进行feign包扫描

@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients 
//注册feign
public void registerFeignClients(AnnotationMetadata metadata,
      BeanDefinitionRegistry registry) {

if (clients == null || clients.length == 0) {
   scanner.addIncludeFilter(annotationTypeFilter);
   //获取包扫描路径
   basePackages = getBasePackages(metadata);
}
private void registerFeignClient(BeanDefinitionRegistry registry,
      AnnotationMetadata annotationMetadata, Map<String, Object> attributes) {
   
   //获取一个Builder,后续实例化会依赖这个FeignClientFactoryBean
   BeanDefinitionBuilder definition = BeanDefinitionBuilder
         .genericBeanDefinition(FeignClientFactoryBean.class);
   //...
   String alias = contextId + "FeignClient";
   //bean注册
   BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry);
}

2.通过ReflectiveFeign创建代理:

public <T> T newInstance(Target<T> target) 
    InvocationHandler handler = factory.create(target, methodToHandler);
    T proxy = (T) Proxy.newProxyInstance(target.type().getClassLoader(),
        new Class<?>[] {target.type()}, handler);

    for (DefaultMethodHandler defaultMethodHandler : defaultMethodHandlers) {
      defaultMethodHandler.bindTo(proxy);
    }
return proxy;