Spring如何识别@FeignClient
从@EnableFeignClients 出发,寻找Spring如何识别FeignClient
从源码中查看到@Import(FeignClientsRegistrar.class)
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
// 省略内部代码
}
查看FeignClientsRegistrar 的类图如下,
ResourceLoaderAware 注入 ResourceLoader
EnvironmentAware 注入 Environment
ImportBeanDefinitionRegistrar: 注册额外的beanDefinition
ImportBeanDefinitionRegistrar# registerBeanDefinitions ,FeignClientsRegistrar 的实现如下:
@Override
public void registerBeanDefinitions(
AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
// 处理@EnableFeignClients上的defaultConfiguration配置
registerDefaultConfiguration(metadata, registry);
// 处理@FeignClient注解
registerFeignClients(metadata, registry);
}
查阅registerFeignClients 部分的代码,大致逻辑为找到@FeignClient标注的接口,注册到Spring,那注册到Spring的Bean是什么呢??
我们一起来查看下registerFeignClient 方法, FeignClientFactoryBean 就是我们要找的主角了。
private void registerFeignClient(BeanDefinitionRegistry registry, AnnotationMetadata annotationMetadata,
Map<String, Object> attributes) {
String className = annotationMetadata.getClassName();
Class clazz = ClassUtils.resolveClassName(className, null);
Configu