Spring 函数式端点详解

文章目录

  • Spring 函数式端点详解
    • 一、引言
    • 二、函数式端点的实现
      • 1、创建函数端点
        • 1.1、定义处理程序
      • 2、定义路由器函数
      • 3、运行应用程序
    • 三、函数式端点的实际应用
      • 1、实现用户相关端点
        • 1.1、定义路由器配置
        • 1.2、定义处理程序逻辑
    • 四、总结

Spring 函数式端点详解

一、引言

Spring Web MVC 的发展引入了函数式编程范式,其中 WebMvc.fn 是一个重要的里程碑。它不仅简化了路由和请求处理的方式,还提高了代码的可读性和维护性。本文将深入探讨 Spring 函数式端点的概念、实现和最佳实践。

二、函数式端点的实现

1、创建函数端点

在 Spring Web MVC 中,使用 WebMvc.fn 创建端点是一种简单而现代的方法。以下是创建基本非反应性函数端点的步骤。

1.1、定义处理程序

首先,定义一个处理程序类,包含处理请求的方法:

import org.springframework.http.ResponseEntity;
import org.springframework.web.servlet.function.ServerRequest;
import org.springframework.web.servlet.function.ServerResponse;public class WelcomeHandler {public ServerResponse welcome(ServerRequest request) {return ServerResponse.ok().body("Welcome to Spring Web MVC!");}
}

在这个例子中,WelcomeHandler 类有一个 welcome 方法,它接受 ServerRequest 并返回 ServerResponse

2、定义路由器函数

接下来,定义一个路由器函数,将请求映射到处理程序:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.function.RouterFunction;
import org.springframework.web.servlet.function.RouterFunctions;
import org.springframework.web.servlet.function.ServerResponse;@Configuration
public class WelcomeRouter {@Beanpublic RouterFunction<ServerResponse> route(WelcomeHandler welcomeHandler) {return RouterFunctions.route().GET("/welcome", welcomeHandler::welcome).build();}
}

WelcomeRouter 中,route 方法使用 RouterFunctions.route() 将 HTTP GET 请求映射到 /welcome 路径上的 WelcomeHandlerwelcome 方法。

3、运行应用程序

最后,创建一个 Spring Boot 应用程序类来运行应用程序:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class WelcomeApplication {public static void main(String[] args) {SpringApplication.run(WelcomeApplication.class, args);}
}

运行 WelcomeApplication 后,通过向 http://localhost:8080/welcome 发送 GET 请求来测试端点。你应该会收到 “Welcome to Spring Web MVC!” 的回复。

三、函数式端点的实际应用

1、实现用户相关端点

在实际应用中,我们可以使用 WebMvc.fn 实现更复杂的端点,例如 “获取用户” 和 “获取用户集合” API。

1.1、定义路由器配置
@Configuration
public class WebFnConfig {@BeanRouterFunction<ServerResponse> userRouter(UserHandler userHandler) {return RouterFunctions.route().path("/fn", userHandler::routerFn).build();}
}

这里,.path("/fn", userHandler::routerFn) 方法将所有带有 /fn 路径前缀的请求映射到 UserHandler 中的 routerFn 方法。

1.2、定义处理程序逻辑
@Component
public class UserHandler {private final UserService userService;public UserHandler(UserService userService) {this.userService = userService;}public RouterFunction<ServerResponse> routerFn() {return RouterFunctions.route().GET("/user/{id}", accept(APPLICATION_JSON), this::specificUser).GET("/user/", accept(APPLICATION_JSON), this::allUsers).build();}public ServerResponse specificUser(ServerRequest request) {Long userId = Long.parseLong(request.pathVariable("id"));String selfLink = UriComponentsBuilder.fromPath(request.path()).build().toUriString();return ServerResponse.ok().header("Link", selfLink).body(new ResponseObject(selfLink, userService.getUserById(userId)));}public ServerResponse allUsers(ServerRequest request) {String selfLink = UriComponentsBuilder.fromPath(request.path()).build().toUriString();return ServerResponse.ok().header("Link", selfLink).body(new ResponseObject(selfLink, userService.allUsers()));}
}

在这个例子中,UserHandler 包含两个 GET 方法:/user/{id} 用于获取特定用户,/user/ 用于获取所有用户。

四、总结

Spring 函数式端点提供了一种声明性和简洁的方式来处理 HTTP 请求,它利用 Java 8 的 lambda 表达式和函数式接口,以路由为中心的方法使代码更加清晰和简洁。这种方法不仅简化了开发过程,还增强了 Web 应用程序的性能。通过遵循最佳实践并避免常见陷阱,开发人员可以充分利用 Spring 函数式端点的潜力,构建更高效、可扩展且可维护的 Web 服务。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • Spring中WebMvc.fn函数式端点

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/8528.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

块存储、文件存储和对象存储详细介绍

块存储、文件存储和对象存储介绍 块存储&#xff1a;像跑车&#xff0c;因为它们都能提供快速的响应和高性能&#xff0c;适合需要即时数据访问的场景&#xff0c;比如数据库和虚拟化技术。 文件存储&#xff1a;像货车&#xff0c;因为它们都能承载大量货物&#xff08;文件&…

ARM base instruction -- umaddl

Unsigned Multiply-Add Long multiplies two 32-bit register values, adds a 64-bit register value, and writes the result to the 64-bit destination register. 将两个32位寄存器值相乘&#xff0c;添加一个64位寄存器值&#xff0c;并将结果写入64位目标寄存器。 64-bit…

bossplayersCTF: 1 靶场渗透

靶场&#xff1a;bossplayersCTF: 1 bossplayersCTF: 1 ~ VulnHubhttps://www.vulnhub.com/entry/bossplayersctf-1,375/ 攻击机&#xff1a;kali-linux-2024 第一部分&#xff1a;信息收集 1,将两台虚拟机网络连接都改为NAT模式&#xff0c;并查看靶机的MAC地址 2&#xff0c;…

【linux学习指南】磁盘分区挂载到目录,形成文件系统挂载点

文章目录 &#x1f4dd;前言&#x1f320; 查看系统分区&#x1f309;制作一个大的磁盘块&#xff0c;就当做一个分区&#x1f309;格式化写入文件系统&#x1f309;将分区挂载到指定的目录&#x1f309;在分区重创建文件&#x1f309;卸载分区&#x1f309;分区挂载到目录才能…

STM32CUBEIDE FreeRTOS操作教程(八):queues多队列

STM32CUBEIDE FreeRTOS操作教程&#xff08;八&#xff09;&#xff1a;queues多队列 STM32CUBE开发环境集成了STM32 HAL库进行FreeRTOS配置和开发的组件&#xff0c;不需要用户自己进行FreeRTOS的移植。这里介绍最简化的用户操作类应用教程。以STM32F401RCT6开发板为例&#…

redis 原理篇 25 网络模型 信号驱动IO 及 异步IO

剩下这两种&#xff0c;用得少&#xff0c;快速过一下&#xff0c; 说啥队列太小&#xff0c;这个不是问题&#xff0c;搞个持久化&#xff0c; 说啥队列元素太频繁导致开销大&#xff0c;这个也没问题&#xff0c;搞成批量入队&#xff0c;减少频率&#xff0c;增大吞吐量&am…

某事业单位转型公益二类后岗位梳理项目纪实

某事业单位转型公益二类后岗位梳理项目纪实 ——公益一类事业单位转型二类后&#xff0c;如何优化岗位配置&#xff0c;梳理岗位职责 【客户行业】事业单位 【问题类型】岗位梳理 【客户背景】 某地公证机构于20世纪90年代经批准设立&#xff0c;是该市司法局直属国家公证…

DNS域名解析服务器--RHCE

1.DNS简介 DNS &#xff08; Domain Name System &#xff09;是互联网上的一项服务&#xff0c;它作为将域名和 IP 地址相互映射的一个分布式 数据库&#xff0c;能够使人更方便的访问互联网 DNS 系统使用的是网络的查询&#xff0c;那么自然需要有监听的 port 。 DNS 使用的是…

Linux案例:DNS服务器配置

Linux案例&#xff1a;DNS服务器配置 实验一&#xff1a;正向解析 服务端配置&#xff1a; [rootserver ~]# setenforce 0 [rootserver ~]# nmcli c modify ens160 ipv4.method manual ipv4.addresses 192.168.70.131/24 ipv4.gateway 192.168.70.2 ipv4.dns 114.114.114.11…

京东创作平台旋转验证码识别

昨天京东创作平台验证码又更新了&#xff0c;变成了这种旋转验证码。经过我们一天的努力&#xff0c;终于完成了这款验证码的数据标记&#xff0c;模型训练。现在正确率达到了几乎100%。 识别代码 只需要获取图片链接&#xff0c;下载图片得到原图&#xff0c;使用下面代码就可…

Spring DispatcherServlet详解

文章目录 Spring DispatcherServlet详解一、引言二、DispatcherServlet的初始化与工作流程1、DispatcherServlet的初始化1.1、加载配置和建立WebApplicationContext1.2、初始化策略 2、DispatcherServlet的工作流程2.1、请求分发2.2、代码示例 三、总结 Spring DispatcherServl…

Ubuntu 安装CUDA, cuDNN, TensorRT(草稿)

文章目录 写在前面一、CUDA, cuDNN, TensorRT 三个库的版本的确定二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04, 本文安装的版本&#xff1a; cuda_11.1.0&#xff1b;cuDNN-8.2.1&#xff1b;TensorRT-8.2.4.2 一、CUDA, cuDNN, TensorRT 三个库…

[GDKOI2024 普及组] 读书(线段树)

luogu 传送门https://www.luogu.com.cn/problem/P10077 解题思路 我们可以贪心地思考&#xff1a;每次寻找最小值&#xff0c;然后去阅读这一章。 直到阅读的章数达到 。 这样&#xff0c;你就可以写出一个 的暴力&#xff0c;拿 40 分。 但是&#xff0c;如果你并不满足于…

TCP/IP基础

TCP/IP的概念 TCP/IP是一个协议簇&#xff0c;包括多个协议 定义了计算机操作系统如何连入因特网&#xff0c;以及数据如何在他们之间传输的标准。 TCP/IP的分层结构 TCP/IP按照层次可以分成四层&#xff0c;应用层、传输层、网络层和数据链路层 应用层 包括虚拟终端协议…

数据迁移: 安全高效转移数据, 满足企业业务需求和技术改进

天津鸿萌科贸发展有限公司从事数据安全服务二十余年&#xff0c;致力于为各领域客户提供专业的数据存储、数据恢复、数据备份、数据迁移等解决方案与服务&#xff0c;并针对企业面临的数据安全风险&#xff0c;提供专业的相关数据安全培训。 鸿萌数据迁移业务为众多企业顺利高效…

可视化建模与UML《类图实验报告》

史铁生&#xff1a; 余华和莫言扛着我上火车&#xff0c; 推着走打雪仗&#xff0c; 还带我偷西瓜&#xff0c; 被人发现后他们拔腿就跑&#xff0c; 却忘了我还在西瓜地里。 一、实验目的&#xff1a; 1、熟悉类图的构件事物。 2、熟悉类之间的泛化、依赖、聚合和组合关系…

Zypher Network:全栈式 Web3 游戏引擎,服务器抽象叙事的引领者

近期&#xff0c;《黑神话&#xff1a;悟空》的爆火不仅让 AAA 游戏重回焦点&#xff0c;也引发了玩家与开发者的热议。Web2 游戏的持续成功导致部分 Web3 玩家们的倒戈&#xff0c;对比之下 Web3 游戏存在生命周期短且商业模式难以明确的问题&#xff0c;尤其在当前加密市场环…

C++11的简介

杀马特主页&#xff1a;羑悻的小杀马特.-CSDN博客 ------ ->欢迎阅读 欢迎阅读 欢迎阅读 欢迎阅读 <------- 目录 一列表初始化的变化&#xff1a; 二左右值即各自引用的概念&#xff1a; 2.1左右…

Java 上机实践3(分支与循环语句)

&#xff08;大家好&#xff0c;今天分享的是Java的相关知识&#xff0c;大家可以在评论区进行互动答疑哦~加油&#xff01;&#x1f495;&#xff09; 目录 实验一&#xff1a;回文数 一、实验目的 二、实验要求 三、程序代码 四、实验结果 实验二&#xff1a;猜数字…

[MRCTF2020]PYWebsite1

如果输入的密钥是对的那么我们就直接跳转到flag.php页面 那么我们直接访问&#x1f60e;&#xff0c;他不带我们去我们自己去. 那就用XFF呗. 知识点&#xff1a; 定义&#xff1a;X-Forwarded-For是一个HTTP请求头字段&#xff0c;用于识别通过HTTP代理或负载均衡方式连接到W…