RestTemplate源码分析

·  阅读 466

背景

之前在RestTemplate负载均衡 中说要写一篇文章来分析RestTemplate的源码。本文按照目前自己对源码的分析来写一下。

类图

如下是RestTemplate的类图,从图中可以看到RestTemplate继承了InterceptingHttpAccessor,实现了RestOperations接口。其中RestOperations接口包括RestTemplate需要实现的外部接口。

image.png

InterceptingHttpAccessor则继承了HttpAccessor,该类是一个抽象类,该类中没有抽象的方法,但是有一个protected方法:

protected ClientHttpRequest createRequest(URI url, HttpMethod method) throws IOException {
  ClientHttpRequest request = getRequestFactory().createRequest(url, method);
  if (logger.isDebugEnabled()) {
     logger.debug("HTTP " + method.name() + " " + url);
  }
  return request;
}
复制代码

getRequestFactory().createRequest(url, method)创建一个ClientHttpRequest

image.png

ClientHttpRequest是一个接口,接口继承了HttpRequest以及HttpOutputMessage接口。最重要的是必须实现execute()方法。这个方法是整个RestTemplate的核心方法。ClientHttpRequest是一个接口,默认的实现类有很多比如OkHttp3ClientHttpRequest、HttpComponentsClientHttpRequest等都是其常用实现,如果觉得默认实现无法满足需求,也可以参考OkHttp3ClientHttpRequests按需实现。

核心实现

上面提到ClientHttpRequest的execute()方法是核心,下面就介绍这个方法的执行流程。

image.png

restTemplate调用HttpAccessor的createRequest方法创建ClientHttpRequest,ClientHttpRequest最终的创建者是ClientRequestFactory工厂,这个工厂可以由调用者配置。ClientHttpRequest调用不同子类的execute方法,这里以OKHttp+loadBalanced为例进行介绍。ClientHttpRequest调用executeInternal方法,然后创建InterceptingRequestExecution对象。InterceptingRequestExecution对象调用 ClientHttpRequestInterceptort的intercept方法。ClientHttpRequestInterceptor也是一个抽象的接口,在系统初始化的时候创建。真实的http请求发送是在ClientHttpRequestInterceptor实现类中。ClientHttpRequestInterceptor以后单独写一篇文章介绍。restTemplate在完成clientHttpRequest的execute方法调用之后,最后调用handleResponse处理返回值,resttemplate提供默认的ResponseErrorHandler处理响应值。开发者也可以创建自己的ResponseErrorHandler,并在初始化的时候set到RestTemplate中。

小结

可以看到RestTemplate虽然比较简单,但是涉及到类与类之间的交互还是比较复杂,中间用到了很多类与接口的继承,也可以到工厂模式的广泛应用,值得学习参考的东西还是比较多,这是本人第一次源码分析的文章,写的不好的地方还望大家批评指正。

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改