openFeign这个框架要解决的问题是:通常在调用远程接口的时候,如果是http请求,需要我们通过restTemplate去拼接调用参数和连接,然后发起调用,openFeign帮我们把拼接参数的这个过程包装了起来,通过代理对象的模式,帮我们构建http请求,而我们在使用的时候,就向写mybatis中的mapper接口一样,即可
openFeign的源码,看起来是比较简单的,如果有看过spring的源码,看起来就会快很多
1.使用
在使用的时候
引入jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
然后在启动类上,加上@EnableFeignClients注解
最后,在我们定义的接口上,加上@FeignClient注解
@FeignClient注解所要修饰的接口,是我们在自己的应用中定义的,需要和调用的远程接口定义保持一模一样
2.源码
我们从启动类上的注解开始来看,通常在这个注解中,会有一些逻辑的处理
我们可以看到,FeignClientsRegistrar是ImportBeanDefinitionRegistrar的实现类,ImportBeanDefinitionRegistrar是spring提供的扩展点之一,我们可以在其实现方法中,自己注入对象到beanDefinitionMap集合中
2.1 registerDefaultConfiguration
可以看到,在实现方法中,有两个方法,registerDefaultConfiguration这个方法的逻辑看起来比较简单,就是根据@EnableFeignClients注解,build了一个beanDefinition对象,然后注入到了beanDefinitionMap集合中
2.2 registerFeignClients
我们需要关注的是第二个方法:registerFeignClients(),
public void registerFeignClients(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
// 1.初始化一个扫描器,是为了去指定的包下,扫描指定的bean
ClassPathScanningCandidateComponentProvider scanner = getScanner();
scanner.setResourceLoader(this.resourceLoader);
Set<String> basePackages;
Map<String, Object> attrs = metadata
.getAnnotationAttributes(EnableFeignClients.class.getName());
AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter(
FeignClient.class);
final Class<?>[] clients = attrs == null ? null
: (Class<?>[]) attrs.get("clients");
//如果@Enable注解中没有指定client,会走这里的逻辑
if (clients == null || clients