【feign源码】流程分析

本文深入探讨Feign的配置和实例创建过程。通过FactoryBean的FeignClientFactoryBean,每个Feign客户端实现多例,利用FeignContext进行配置区分。开发者可以定制每个客户端组件,通过配置文件或FeignClient的configuration属性。创建实例时,使用Feign.Builder.target方法,结合InvocationHandler进行方法处理。
摘要由CSDN通过智能技术生成

Feign的接口和Mybatis的接口相似,都是通过FactoryBean实现了spring整合的,那么扫包的就不再分析了,直接看FactoryBean–FeignClientFactoryBean

	@Override
	public Object getObject() throws Exception {
   
		return getTarget();
	}
	<T> T getTarget() {
   
		FeignContext context = this.applicationContext.getBean(FeignContext.class);
		// 配置Fegin
		Feign.Builder builder = feign(context);

		if (!StringUtils.hasText(this.url)) {
   
			if (!this.name.startsWith("http")) {
   
				this.url = "http://" + this.name;
			}
			else {
   
				this.url = this.name;
			}
			this.url += cleanPath();
			return (T) loadBalance(builder, context,
					new HardCodedTarget<>(this.type, this.name, this.url));
		}
		if (StringUtils.hasText(this.url) && !this.url.startsWith("http")) {
   
			this.url = "http://" + this.url;
		}
		String url = this.url + cleanPath();
		Client client = getOptional(context, Client.class);
		if (client != null) {
   
			if (client instanceof LoadBalancerFeignClient) {
   
				// not load balancing because we have a url,
				// but ribbon is on the classpath, so unwrap
				client = ((LoadBalancerFeignClient) client).getDelegate();
			}
			if (client instanceof FeignBlockingLoadBalancerClient) {
   
				// not load balancing because we have a url,
				// but Spring Cloud LoadBalancer is on the classpath, so unwrap
				client = ((FeignBlockingLoadBalancerClient) client).getDelegate();
			}
			builder.client(client);
		}
		// 返回实例;
		Targeter targeter = get(context, Targeter.class);
		return (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值