Feign源码学习(2)

2017-09-02  本文已影响0人  無式

ReflectiveFeign

 /**
  * ReflectiveFeign.newInstance 生成proxy代理实现的主逻辑
  * @param Target<T> 在Feign.target中传入的代理目标Class与host url参数
  */
  public <T> T newInstance(Target<T> target) {
    //核心逻辑入口,反射解析目标Class,得到MethodHandler集合
    Map<String, MethodHandler> nameToHandler = targetToHandlersByName.apply(target);
    Map<Method, MethodHandler> methodToHandler = new LinkedHashMap<Method, MethodHandler>();
    List<DefaultMethodHandler> defaultMethodHandlers = new LinkedList<DefaultMethodHandler>();

    for (Method method : target.type().getMethods()) {
      //Object的方法(如toString之类的)就无视
      if (method.getDeclaringClass() == Object.class) {
        continue;
      } 
      //Default方法处理
      else if(Util.isDefault(method)) {
        DefaultMethodHandler handler = new DefaultMethodHandler(method);
        defaultMethodHandlers.add(handler);
        methodToHandler.put(method, handler);
      } 
      //Http请求代理方法
      else {
        methodToHandler.put(method, nameToHandler.get(Feign.configKey(target.type(), method)));
      }
    }

    //主要逻辑,生成proxy,实现其中的Rest请求方法。
    //InvocationHandler实现类为FeignInvocationHandler
    InvocationHandler handler = factory.create(target, methodToHandler);
    T proxy = (T) Proxy.newProxyInstance(target.type().getClassLoader(), new Class<?>[]{target.type()}, handler);

    //处理其他默认方法,绑定到Proxy上
    for(DefaultMethodHandler defaultMethodHandler : defaultMethodHandlers) {
      defaultMethodHandler.bindTo(proxy);
    }
    return proxy;
  }

FeignInvocationHandler

  interface MethodHandler {
    Object invoke(Object[] argv) throws Throwable;
  }
  //FeignInvocationHandler部分代码
  static class FeignInvocationHandler implements InvocationHandler {
    //代理目标Class
    private final Target target;
    //持有前面解析出来的MethodHandler集合
    private final Map<Method, MethodHandler> dispatch;

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
      //一些特殊方法的处理
      if ("equals".equals(method.getName())) {
        try {
          Object otherHandler =
              args.length > 0 && args[0] != null ? Proxy.getInvocationHandler(args[0]) : null;
          return equals(otherHandler);
        } catch (IllegalArgumentException e) {
          return false;
        }
      } else if ("hashCode".equals(method.getName())) {
        return hashCode();
      } else if ("toString".equals(method.getName())) {
        return toString();
      }
      //Rest请求方法调用,并返回结果
      return dispatch.get(method).invoke(args);
    }
  }
上一篇 下一篇

猜你喜欢

热点阅读