feign创建代理对象

文章讲述了在Spring中自定义注册Feign代理对象遇到的问题及解决方案,包括处理jar包冲突、使用OptionalDecoder解析返回结果、添加拦截器处理请求头,以及对源码中设计模式的理解和应用。同时强调了增强Java基础和理解优秀代码的重要性。
摘要由CSDN通过智能技术生成

寄上次spring自定义注册feign

之前创建feign代理对象,是偷懒的抄源码中的构建beanDefinition的方式,后面通过spring本身通过beanDefinition去创建bean对象的。

这里面有很多不满足的地方,比如我们的项目pom中引入了uc包,但是上传jar包的过程中上传了同样的uc包,但是getBean出来的是我们项目中的uc包中的对象,这显然是不合理的,源码中是从缓存map中拿的,项目启动的时候就加载好了,而覆盖的话,肯定会影响项目中原有的功能。
根本原因就是,两个不同的uc包数据存放在了一起,改一个另一个也会跟着动,所以要分开存储。

加载jar包的过程,加载jar包中的类到自定义的map< 类的全路径,类本身>中,如果解析到类上面有feignClient注解,那么会自己通过源码包中的Feign.Builder去自己构建代理对象。
1.里面需要client对象,我是从spring原有的feignBuilder中获取的。
2.里面还要添加deCoder,用来解析接口返回的结果的。通过debug发现,feign使用的是OptionalDecoder,抄源码把他拿过来。
3. 调用方有的方法需要token的,这边builder也支持添加拦截器。在拦截器中获取request,添加header属性。

	@Autowired
    private Feign.Builder feignBuilder;  // spring容器本身就有的

	@Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters; // spring容器本身就有的

    public Decoder feignDecoder() {
        return new OptionalDecoder(
                new ResponseEntityDecoder(new SpringDecoder(this.messageConverters)));
    }

	public Object getFeignProxy(Class clazz,String name,String url){
        Target.HardCodedTarget target = new Target.HardCodedTarget(clazz, name, url);
        builder.decoder(feignDecoder());
        Field clientField = feignBuilder.getClass().getDeclaredFields()[0];
        clientField.setAccessible(true);
        try {
            builder.client((Client) clientField.get(feignBuilder));
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }

        builder.requestInterceptor(feignInterceptor);
        Feign feign = builder.build();

        Object proxy = null;
        try {
            proxy = feign.newInstance(target);
        } catch (Throwable e) {
            log.error("创建feign的代理对象失败",e);
        }

        // 将代理对象存储进map中
        feignJarClazzMap.put(clazz.getName(),proxy);
        return proxy;
    }

总结:

  1. 源码中的设计模式还是挺多的,看人家代码,看懂了设计模式,里面的边边角角理解起来就很快了。多去看看优秀的代码,理解里面用到的设计模式。
  2. java基础还有待提升,Feign本身是个抽象类,但是里面有个内部的静态类Builder,你想要Buuilder,可以直接new。不需要想法设法的去创建Feign然后去构建builder。
  3. 多思考,多做有效的输出总结。
  4. 在调用源码中的方法的时候,入口真的很多,无法下手的,还是要自己多看看,那种焦灼的心情,眼前一团乱麻的感觉不好受的
  5. 有的时候问题本身不是问题,由其他原因引起的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值