前言

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

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;不信??看源码(应该没人不信吧┑( ̄Д  ̄)┍)

BodyBuilder又是什么鬼

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的。。

【Spring】源码浅析 - ResponseEntity.ok相关推荐

  1. Spring源码浅析之AOP、Aspect、Advice

    前言 理一理AOP与切面(Aspect).通知(Advice)的关系 概念 通知(Advice): AOP 框架中的增强处理.通知描述了切面何时执行以及如何执行增强处理. 连接点(join point ...

  2. spring初始化源码浅析之代码浅析

    目录 1.refresh()简介 2.关键代码跟踪 ​2.1.obtainFreshBeanFactory()代码分析 2.2.invokeBeanFactoryPostProcessors(bean ...

  3. Spring-Web(一) RestTemplate使用与源码浅析

    Spring RestTemplate使用与源码浅析 一.RestTemplate 概述 ​ RestTemplate 是 Spring Web 模块封装的一个基于Rest规范提供HTTP请求服务的工 ...

  4. Spring源码分析【1】-Tomcat的初始化

    org.apache.catalina.startup.ContextConfig.configureStart() org.apache.catalina.startup.ContextConfig ...

  5. Spring源码分析【0】-框架的基础:继承和接口调用链

    Spring源码大量的使用继承和接口调用,现举个例子,不搞清楚这个无法看代码. public class A extends B{public void f1() {System.out.printl ...

  6. Spring源码分析篇(一)之Gradle环境搭建

    Gradle的简介我就不在此多废话了,我们直接上步骤 本人的操作环境是mac jdk1.8+spring5.x版本 编译工具:IDEA IntelliJ 一.熟悉你需要的spring源码包 这个源码包 ...

  7. spring根据名称获取bean_带你从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  8. 想读Spring源码?先从这篇「 极简教程」开始

    来自:Java中文社群 为什么要阅读源码?这是一个有趣的问题,类似的问题还有,为什么要看书?为什么要爬山? 这也是一个哲学问题,我想每个人都有不同的答案,下面我是对阅读源码好处的一些思考.(PS:也欢 ...

  9. spring 源码 找不到 taskprovider_一步一步构建Spring5源码

    点关注,不迷路:持续更新Java相关技术及资讯!!! 构建环境 macOS 10.13.6 JDK1.8 IntelliJ IDEA 2018.3.6 (Ultimate Edition) Sprin ...

  10. 如何将spring源码作为导入eclipse中,变成一个普通的项目(git、github)

    引子: 怎么查看spring-framework的源码?是不是用压缩软件解压jar包,然后用编辑软件看?高端一点的,是在eclipse上面,按住Ctrl键跳转着看?这里我给大家介绍更加高端一点的方法. ...

最新文章

  1. 如何获得Oracle系统性能统计? Oracle大型数据库系统在AIXUNIX上的实战详解 集中讨论 14...
  2. Vue学习01-v-on事件修饰符
  3. pyinstaller生成exe文件失败
  4. sed模式空间(pattern space)和保持空间(hold space)
  5. Struts2笔记——struts常用标签
  6. 190303每日一句
  7. MatLab基本知识学习 详细!
  8. 极光IM简单接入步骤
  9. Myeclipse2017破解:成功解决me Trial expired 0 days ago mgeclipse It's now time to buy the best IDE for yo
  10. Open Distro for Elasticsearch:AWS Elasticsearch 发行版
  11. mount挂载不上,不提示任何信息
  12. [MRI] 核磁共振T1和T2图像
  13. 组词组合 php,PHP实现的简单组词算法示例讲解
  14. powerdesigner CDM中联系理解
  15. 《一升的眼泪》日语台词
  16. Windows下安装MySQL5
  17. 字符串输出时最后出现乱码
  18. 读《世界因你而不同--李开复自传》的感想
  19. 《Turtle绘图》用Python的Turtle画一个雪红灯笼
  20. xuetr win7 64 进程查看

热门文章

  1. ccs: memory range overlaps existing memory range
  2. win10计算机系统优化设置,小编教你windows10设置优化提高系统性能
  3. 京东商城SPU、SKU是如何设计的
  4. HDU--2015-TO-2019--假期实在是太无聊了....
  5. java.lang.IllegalArgumentException: The number of object passed must be even but was [1]
  6. .net core mvc中使用ef
  7. MEMORY系列之“DRAM概述”
  8. 极坐标xy的转换_极坐标与直角坐标的转化
  9. linux 脚本 pause,Linux Shell脚本pause命令
  10. Notepad JSON格式化