1、我们定义Feign Client时候,可以通过configuration参数指定一个配置类,那么指定的这个配置入口类上面是否需要添加 @Configuration 注解呢?
@FeignClient(name = "OrderServiceClient", contextId = "OrderServiceClient", url = "${order-service.baseUrl}",
fallbackFactory = OrderServiceClientFallbackFactory.class, configuration = OrderServiceClientConfiguration.class)
public interface OrderServiceClient {
/**
* 查询订单sku信息
*/
@PostMapping("/v1/order/skus")
OrderSkuResponse queryOrderSku(@NotNull @RequestBody OrderSkuRequest request);
}
@Configuration
public class OrderServiceClientConfiguration {
@Bean
public OrderServiceInterceptor orderServiceInterceptor() {
return new OrderServiceInterceptor();
}
}
这是我工作中定义的一个Feign 接口, 然后配置了configuration参数,然后在OrderServiceClientConfiguration 配置类中注入RequestInterceptor ,一开始OrderServiceClientConfiguration 添加了 @Configuration 注解。 发现其它的Feign Client调用也会执行OrderServiceInterceptor中的代码 。废话不多说,直接看下这块源代码便知分晓。
public void registerFeignClients(AnnotationMetadata metadata,
BeanDefinitionRegistry registry) {
ClassPathScanningCandidateComponentProvider scanner = getScanner();
scanner.setResourceLoader(this.resourceLoader);
// 有些代码省略 .....
for (String basePackage : basePackages) {
Set<BeanDefinition> candidateComponents = scanner
.findCandidateComponents(basePackage);
for (BeanDefinition candidateComponent : candidateComponents) {
if (candidateComponent instanceof AnnotatedBeanDefinition) {
// verify annotated class is an interface
AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;
AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
Assert.isTrue(annotationMetadata.isInterface(),
"@FeignClient can only be specified on an interface");
Map<String, Object> attributes = annotationMetadata
.getAnnotationAttributes(
FeignClient.class.getCanonicalName());
// 这段代码可以去看看,优先级 contextId > name > value
String name = getClientName(attributes);
// configuration配置参数相关代码
registerCli