【Spring】源码浅析 - ResponseEntity.ok

前言

  • 为什么这篇又不是Spring Boot初体验,因为在初体验过程中,我使用的方法返回值类型并不是基本数据类型,也不是String,而是用了ResponseEntity,为了避免有些人看不懂,在这篇做个ResponseEntity的源码浅析。
  • 主要浅析ResponseEntity.ok方法的源码
  • 本文是基于Spring5源码进行浅析
  • 本文及以后文章中的 API 指的是API文档描述

ResponseEntity.class

让我们打开ResponseEntity.class
ResponseEntity.class(部分)

嗯。可以说是非常的清爽了;一个注释文档都没看到┑( ̄Д  ̄)┍
无奈;只好上官网找API:ResponseEntity API

ResponseEntity概念

Extension of HttpEntity that adds a HttpStatus status code. Used in RestTemplate as well @Controller methods.

以上引用自ResponseEntity API

直译
可以添加HttpStatus状态码的HttpEntity的扩展类。被用于RestTemplate和Controller层方法
简单粗暴理解
ResponseEntity继承了HttpEntity,是HttpEntity的子类且可以添加HttpStatus状态码(推测HttpEntity不能添加HttpStatus状态码)。被用于RestTemplate和Controller层方法

ResponseEntity.ok API

在ResponseEntity中有两个ok方法;一个无参,一个有参
* public static ResponseEntity.BodyBuilder ok()

Create a builder with the status set to OK.

以上引用自ResponseEntity API

直译
创建一个设置了OK状态的builder
简单粗暴理解
这个方法若被调用的话,返回OK状态
* public static ResponseEntity ok(T body)

A shortcut for creating a ResponseEntity with the given body and the status set to OK.

以上引用自ResponseEntity API

直译
一种捷径去创建ResponseEntity,通过被给予的body和设置了OK的状态
简单粗暴理解
这个方法若被调用的话,返回body内容和OK状态

至于OK状态是什么,后面再解释

ResponseEntity.ok源码

//无参ok
public static ResponseEntity.BodyBuilder ok() {
        return status(HttpStatus.OK);
    }

//有参ok
public static <T> ResponseEntity<T> ok(T body) {
        ResponseEntity.BodyBuilder builder = ok();
        return builder.body(body);
    }

通过源码,我们不难发现
* 与API中的描述一致,无参ok方法返回OK状态,有参ok方法返回body内容和OK状态
* body类型 是 泛型T,也就是我们不确定body是什么类型,可以向ok方法传递任意类型的值
* 有参ok方法其实有调用无参ok方法

那么源码中的BodyBuilder又是什么鬼呢,后面再解释

解释一下

OK状态是什么鬼

现在我们都知道ResponseEntity概念是可以添加HttpStatus状态码的HttpEntity的扩展类;那么不难推测出这个OK状态其实就是HttpStatus状态码(其实在上面的源码中也能看到了)

//无参ok
public static ResponseEntity.BodyBuilder ok() {
        return status(HttpStatus.OK);
    }

那么有计算机网络基础的看官都知道,在HttpStatus状态码中代表OK的是200;不信??看源码(应该没人不信吧┑( ̄Д  ̄)┍)
HttpStatus状态码(部分)

BodyBuilder又是什么鬼

ResponseEntity结构

ResponseEntity结构
通过ResponseEntity的结构,我们知道BodyBuilder是ResponseEntity中的接口

BodyBuilder API

Defines a builder that adds a body to the response entity.

以上引用自BodyBuilder API

直译
定义一个可以添加body到response entity的builder
简单粗暴理解
ResponseEntity可以通过这个builder返回任意类型的body内容

BodyBuilder源码

    public interface BodyBuilder extends ResponseEntity.HeadersBuilder<ResponseEntity.BodyBuilder> {
        ResponseEntity.BodyBuilder contentLength(long var1);

        ResponseEntity.BodyBuilder contentType(MediaType var1);

        <T> ResponseEntity<T> body(@Nullable T var1);
    }

通过BodyBuilder源码,不难发现
* BodyBuilder接口中的body方法的参数可以为空值(有@Nullable标签名字推测其允许空值)

后记

  • 感觉写技术文章好艰难,要写好久,而且还要捋顺思路,这难度堪比编程,可能是我写的少的缘故吧(脑阔疼)
  • 这两天被ThreadLocal给吸引住了,在研究ThreadLocal的源码,怎么说,感觉ThreadLocal源码的思维逻辑对现在的我来说,好难理解,过几天(也许是十几天)也会出个ThreadLocal的源码浅析,当然是在写完Spring Boot初体验之后
  • 关于读源码,这是每个程序员的必经之路,而我现在正在经过;嗯。。虽然源码读得有点艰难,但还算有趣吧(真素脑阔疼)

参考文章

ResponseEntity API
BodyBuilder API

下篇预告

Spring Boot初体验

补充 于2018年08月25日

我才发现原来class文件是不会有注释文档的;
在idea中打开class文件,发现idea代码编辑区的右上角有个Download Sources,很明显就是下载源码的意思,我点了,然后源码就下载下来了,根本不用去官网查API的。。
ResponseEntity.java(部分)

  • 20
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值