RestTemplate

restTemplate是spring实现的,基于restful风格的http请求模板。使用restTemplate可以简化请求操作的复杂性,同时规范了代码风格。本系列文章,将根据以下目录顺序,从源码的角度解析restTemplate。

继承结构

  • HttpAccessor,是一个抽象类,它抽象的是一个http访问器的概念。这说明,RestTemplate具备http方式请求响应的处理能力。

  • RestOperations,是一个接口,抽象的是restful风格的操作方法,这意味着RestTemplate的操作风格将是Restful的。

http访问器和restful风格操作做了一个分离。restTemplate则是聚合了两者,既有http访问器的基础能力,又在这个基础之上构建了restful风格。设计者把Restful操作作为接口,其实从规范角度上,我们应该面向RestOperations接口使用它。但大多数人似乎都直接使用RestTemplate,因为默认的实现就是RestTemplate。

restTemplate实例构造过程

接下来,我们再看看new一个RestTemplate对象做了哪些事情。

进入RestTemplate类的构造方法

	private final List<HttpMessageConverter<?>> messageConverters = 
    																			new ArrayList<HttpMessageConverter<?>>();

	private ResponseErrorHandler errorHandler = new DefaultResponseErrorHandler();
  
  // 一个Uri模板的处理器,后续用于处理uri相关的东西
	private UriTemplateHandler uriTemplateHandler = new DefaultUriTemplateHandler();

	private final ResponseExtractor<HttpHeaders> headersExtractor = new HeadersExtractor();

/**
 * Create a new instance of the {@link RestTemplate} using default settings.
 * Default {@link HttpMessageConverter}s are initialized.
 */
public RestTemplate() {
   this.messageConverters.add(new ByteArrayHttpMessageConverter());
   this.messageConverters.add(new StringHttpMessageConverter());
   this.messageConverters.add(new ResourceHttpMessageConverter());
   this.messageConverters.add(new SourceHttpMessageConverter<Source>());
   this.messageConverters.add(new AllEncompassingFormHttpMessageConverter());

   if (romePresent) {
      this.messageConverters.add(new AtomFeedHttpMessageConverter());
      this.messageConverters.add(new RssChannelHttpMessageConverter());
   }

   if (jackson2XmlPresent) {
      this.messageConverters.add(new MappingJackson2XmlHttpMessageConverter());
   }
   else if (jaxb2Present) {
      this.messageConverters.add(new Jaxb2RootElementHttpMessageConverter());
   }

   if (jackson2Present) {
      this.messageConverters.add(new MappingJackson2HttpMessageConverter());
   }
   else if (gsonPresent) {
      this.messageConverters.add(new GsonHttpMessageConverter());
   }
}

构造方案主要是添加HttpMessageConverter的实现类,熟悉springmvc的话估计知道HttpMessageConverter。顾名思义,它就是用来转换http请求响应过程中的消息数据的。

同时restTemplate也默认设置了一些所使用到的Handler。

再看看HttpAccessor

public abstract class HttpAccessor {
    // ...

    private ClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();

    // ...
}

默认创建了一个ClientHttpRequestFactory的实例,ClientHttpRequestFactory这个接口是用来创建客户端的request请求对象的,我们并没有去自定义设置它默认采用SimpleClientHttpRequestFactory这个实现类。

ClientHttpRequestFactory作为工厂模式,将会生产ClientHttpRequest。ClientHttpRequest抽象了Http请求操作,执行ClientHttpRequest将会发送请求与服务端交互。

总结

到这里,RestTemplate的实例构造过程就结束了。其实它的原理就是封装了http请求操作而已。

我们再大体过一下RestTemplate的构造过程

1)在RestTemplate构造方法中添加了多个HttpMessageConverter后续用于http请求响应的数据转换

2)在RestTemplate构造方法中初始化了一个Uri模板的处理器,后续用于处理uri相关的东西

3)HttpAccessor默认创建了一个ClientHttpRequestFactory的成员实例,后续用于创建请求对象。

不过,似乎最有学习价值的还是一开始的restTemplate的设计图。能够理解抽象类与接口的标准设计理念,兴许对面向对象分析与设计大有裨益。

posted @ 2020-06-02 20:34  江舟  阅读(594)  评论(0)    收藏  举报