spirng framework源码解析之spring-core-编解码篇(八)

375 阅读2分钟

这是我参与8月更文挑战的第八天,活动详情查看:8月更文挑战

decoder

首先spring先定义了一个顶级接口Decoder,约定解码的一些公共方法。

canDecode方法

boolean canDecode(ResolvableType elementType, @Nullable MimeType mimeType);

是否能过进行解码操作,相当于满足指定的条件才能进行解码操作。属于前置条件,这里的入参分别是ResolvableTypeMimeType,。

  • ResolvableType 对java类型的一个封装,可以用它来访问父类、接口、参数等
   private HashMap<Integer, List<String>> myMap;
  
   public void example() {
       ResolvableType t = ResolvableType.forField(getClass().getDeclaredField("myMap"));
       t.getSuperType(); // AbstractMap<Integer, List<String>>
       t.asMap(); // Map<Integer, List<String>>
       t.getGeneric(0).resolve(); // Integer
       t.getGeneric(1).resolve(); // List
       t.getGeneric(1); // List<String>
       t.resolveGeneric(1, 0); // String
   }
  • MimeType MIME (Multipurpose Internet Mail Extensions) 是描述消息内容类型的因特网标准。MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据。官方的 MIME 信息是由 Internet Engineering Task Force (IETF) 在下面的文档中提供的:
  • RFC-822 Standard for ARPA Internet text messages
  • RFC-2045 MIME Part 1: Format of Internet Message Bodies
  • RFC-2046 MIME Part 2: Media Types
  • RFC-2047 MIME Part 3: Header Extensions for Non-ASCII Text
  • RFC-2048 MIME Part 4: Registration Procedures
  • RFC-2049 MIME Part 5: Conformance Criteria and Examples

不同的应用程序支持不同的 MIME 类型。

也就是一个标准的协议定义,它的子类就是我们常用的MediaType类,里面有关于http的相关定义。

MimeType.png

decode方法(基于Flux/Mono,响应式)

Flux<T> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType,
      @Nullable MimeType mimeType, @Nullable Map<String, Object> hints);

之所以flux是spring定义的一种响应式输出流类型的接口,是因为底层引用的是第三方reactor,集成了CorePublisher接口,并且封装了大量的方法,供子模块使用,当前我们也可以基于Flux去制定一些属于自己的处理逻辑。

这里顺带说一下关于响应流,它有以下几个基本特征首先是必须是一个无阻塞,可异步执行,能处理背压的数据流。 Flux和Mono都是Publishe在Reactor3的实现,接下来分别简单介绍下他们 1)、Flux是一个发出0-N个元素组成的异步序列的Publisher,可以被onComplete信号或者onError信号所终止。在响应流规范中存在三种给下游消费者调用的方法 onNext, onComplete, 和onError。 2)、Mono是一个发出0-1个元素的Publisher,可以被onCmplete信号或者onError信号所终止。 和Flux差不多,区别在于只会发出0-1个元素。 Publisher-Flux-new.png

ok,最后贴一张整个调用关系图

Decoder.png