整体流程图
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;