点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

1. 前言

通常我们编写 Spring MVC 接口的范式是这样的:

@RestController
@RequestMapping("/v1/userinfo")
public class UserInfoController {@GetMapping("/foo")public String foo() {return "felord.cn";}
}

这种我都写吐了,今天换个口味,使用 Spring 5 新引入的函数式端点(Functional Endpoints)来耍耍。这种方式同样支持 Spring Webflux

请注意可使用该特性的 Spring 版本不低于 Spring 5.2

2. 依赖

为了演示,这里极简化只引入 Spring MVC 的 starter :

 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

3. RouterFunction

在函数式端点的写法中,传统的请求映射(@RequestMapping)被路由函数(RouterFunction)所代替。上面的写法等同于:

    @Beanpublic RouterFunction<ServerResponse> fooFunction() {return RouterFunctions.route().GET("/v1/userinfo/foo", request -> ServerResponse.ok().body("felord.cn")).build();}

在该示例中,我使用了 RouterFunctions.route() 创建了一个RouterFunction,然后RouterFunction 提供了从请求到响应的细节操作。

4. ServerRequest/ServerResponse

ServerRequest 是对服务器端的 HTTP 请求的抽象,你可以通过该抽象获取请求的细节。对应的,ServerResponse 是对服务器端响应的抽象,你也可以通过该抽象构建响应的细节。这两个概念由下面的 HandlerFunction 接口进行 请求 → 响应 处理。

5. HandlerFunction

HandlerFunction 是一个函数式接口,它提供了从请求( ServerRequest)到响应(ServerResponse)的函数映射抽象。通常你的业务逻辑由该接口进行实现。从 ServerRequest 中获取请求的细节,然后根据业务构建一个 ServerResponse 响应。

HandlerFunction<ServerResponse> handlerFunction = request -> ServerResponse.ok().body("felord.cn");

6. RequestPredicate

RequestPredicate 可以让你根据请求的一些细节,比如 请求方法请求头请求参数等等进行断言以决定是否路由。

这里举一个例子,假如我们希望请求接口/v1/userinfo/predicate时根据不同的参数处理不同的业务,当携带参数 plan时才能进行处理。我们可以这么写:

    @Beanpublic RouterFunction<ServerResponse> predicateFunction() {return RouterFunctions.route().GET("/v1/userinfo/predicate",request -> request.param("plan").isPresent(),request -> ServerResponse.ok().body("felord.cn")).build();}

然后我们测试一下:

当携带参数 plan时:

GET http://localhost:8080/v1/userinfo/predicate?plan=HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Content-Length: 9
Date: Thu, 14 May 2020 07:57:35 GMT
Keep-Alive: timeout=60
Connection: keep-alivefelord.cn

不携带参数plan时:

GET http://localhost:8080/v1/userinfo/predicateHTTP/1.1 404
Vary: Origin
Vary: Access-Control-Request-Method
Vary: Access-Control-Request-Headers
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 14 May 2020 08:00:15 GMT
Keep-Alive: timeout=60
Connection: keep-alive{"timestamp": "2020-05-14T08:00:15.659+0000","status": 404,"error": "Not Found","message": "No message available","path": "/v1/userinfo/predicate"
}

7. 小结

函数式端点是 Spring 5 提供的一个新的接口范式风格,对于 Spring MVC 来说 Spring 5.2 才进行了支持。也是顺应函数式编程的一个未来趋势。由于篇幅原因这里仅仅对其中的关键概念进行了讲解。下一篇我们会对这种接口范式进行进一步的讲解和实际使用。敬请关注公众号:码农小胖哥 。

往期推荐

一文搞定分布式系统ID生成方案

10 个经典的 Java 集合面试题,看你能否答得上来?

收藏长文|Java 代码精简之道

面试:说说你对 Java 中 final 的理解?

银行卡支付的背后原理你了解吗?

Spring Boot 2.3.0 发布:支持Java14、打包Docker镜像、优雅关机配置...

如何用你最熟悉的 SQL 来查询 Elasticsearch 中的数据?

欢迎加入我的知识星球,聊聊技术、说说职场、扯扯过去。头发很多的中年程序员DD在这里期待你的到来!加入方式:长按下方二维码噢

目前我已在星球中分享了如下四大板块内容,如果您对这些感兴趣,或是有相关困惑,欢迎加入与我们一起深入交流!

更多详细的精选内容点击阅读原文查看

换一种方式编写 Spring MVC 接口相关推荐

  1. 编写 Spring MVC 控制器的 14 个技巧

    欢迎关注方志朋的博客,回复"666"获面试宝典 通常,在Spring MVC中,我们编写一个控制器类来处理来自客户端的请求.然后,控制器调用业务类来处理与业务相关的任务,然后将客户 ...

  2. requestmapping默认是get还是post_编写Spring MVC控制器的14个技巧,你今天get到了吗?...

    Java面试笔试面经.Java技术每天学习一点 公众号Java面试 关注我不迷路 原文:http://dzone.com/articles/14-tips-for-writing-spring-mvc ...

  3. 吐血整理!14个编写Spring MVC控制器的实用小技巧

    全文共4248字,预计学习时长9分钟 编写Spring MVC控制器的最佳技巧 本文介绍了编写Spring MVC框架的控制器(controller)的基础技巧和最佳操作.在Spring MVC框架中 ...

  4. java配置springmvc_Java方式配置Spring MVC

    概述 使用Java方式配置Spring MVC,以及回顾一下Spring MVC的各种用法. Spring MVC简述 关于Spring MVC的介绍网上有很多,这里就不再赘述了,只是要说一下,Spr ...

  5. Spring框架学习笔记07:基于XML配置方式使用Spring MVC

    文章目录 一.Spring MVC概述 1.MVC架构 2.Spring MVC 3.使用Spring MVC的两种方式 二.基于XML配置与注解的方式使用Spring MVC (一)创建Spring ...

  6. 面对疫情,飞书线上办公室,让我们换一种方式重聚!

    疫情隔离了我们, 但"线上办公室"重新拉近我们! 不需要呼叫, 不需要预约, 随时入会, 随时沟通,让我们换一种方式重聚! 减少会面,共克疫情,飞书免费开放全部远程协作办公服务 2 ...

  7. Android 反射 换一种方式编程

    Android 反射-换一种方式编程 转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/59109933 本文出自[赵彦军的博客] 上一 ...

  8. Spring框架学习笔记08:基于Java配置方式使用Spring MVC

    文章目录 一.基于Java配置与注解的方式使用Spring MVC 1.创建Maven项目 - SpringMVCDemo2020 2.在pom.xml文件里添加相关依赖 3.创建日志属性文件 - l ...

  9. 将一段话换一种方式的软件v.1.2.3

    每次到了刚论文的时候,都要用到将一段话换一种方式的软件,这里总结下如何快速降低论文查重率. 换一种方式的软件使用技巧: 1.层次是否清晰,思路是否顺畅?一般可以先从大标题和小标题的关系来看文章的思路和 ...

最新文章

  1. Keepalived Nginx 高可用性配置
  2. 用Alpha生成Trimp图的方法(python)
  3. 独家解读 etcd 3.4版本 |云原生生态周报 Vol. 18
  4. 前端学习(2240):构造Vue的的利器-脚手架vue-cli3
  5. 【华为大咖分享】3.如何做Code Review 与 结对编程?
  6. 洛谷 P2121 拆地毯
  7. mongo 主从数据不同步
  8. ATOM使用的一点心得与技巧——在一个窗口打开多个项目
  9. 181221每日一句
  10. LCD驱动芯片——BL55072A驱动程序
  11. USB Mass Storage大容量存储的基本知识
  12. linux steam安装目录,如何在Linux系统的服务器中安装steamCMD,常用steam游戏安装指令有哪些...
  13. 文件分配方式-索引分配
  14. 牛客网华为机试在线训练JavaScript版解答
  15. 火焰传感器与 Arduino 连接
  16. PHP-FPM的PM配置参数说明
  17. 服务器显示未知主机如何解决办法,mc服务器时候说我未知主机
  18. 6-1 读文章(*)
  19. 杜甫ndows 10怎么安排五笔,燕字五笔怎么打|燕子|杜甫|出处_诗词_综合试卷网_中国教育考试门户网站...
  20. traceback说明

热门文章

  1. python 创建空文件的方法
  2. linux shell ls 获取绝对路径
  3. python3 调用字符串对应的函数
  4. Docker的4种网络模式
  5. 安装phpMyAdmin图文教程
  6. 函数ZwQuerySystemInformation小结
  7. VMware(VMDebugger)导致VS2010启动慢的解决办法
  8. Java Garbage Collection
  9. 无盘服务器pnp,深入解读无盘PNP方法,无盘系统PNP并不神秘
  10. token 生成有哪几种常用方式_实现一个线程有哪几种方式,各有什么优缺点,比较常用的是那种?...