重学SpringBoot3-函数式Web

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》
期待您的点赞👍收藏⭐评论✍

重学SpringBoot3-函数式Web

  • 函数式Web编程简介
    • RouterFunction
    • RequestPredicate
    • ServerRequest
    • ServerResponse
  • 好处
  • 示例
  • 结论

随着响应式编程范式的兴起和 Java 函数式编程能力的增强,Spring 框架 引入了函数式 Web编程模型,特别是在 Spring WebFlux 中。Spring Boot 3 进一步优化了这一模型,为开发现代 Web 应用提供了更加灵活、简洁的方法。本文将探讨 Spring Boot 3 中的函数式 Web 编程,通过示例解释其好处,并比较传统的注解驱动模型。

函数式Web编程简介

函数式 Web 编程是一种基于函数的编程模型,它强调使用不可变数据和纯函数。在 Spring Web 中,这种模型通过 Router Functions 和 Handler Functions 来实现,为开发者提供了一种新的方式来定义路由和处理请求,而不是依赖于注解。

它有四个核心类:

RouterFunction

RouterFunction 类似于传统 MVC 模式中的控制器,但以函数式的方式工作。它负责映射 HTTP 请求到处理器函数(handler functions)。通过组合多个 RouterFunction,可以构建出复杂的路由逻辑,同时保持代码的简洁和可维护性。简而言之,RouterFunction 定义了当接收到特定请求时应该调用哪个处理器函数。

RequestPredicate

RequestPredicate 用于定义路由条件,决定某个请求是否匹配特定的路由。它基于请求的各种属性,如路径、HTTP 方法、头信息等来判断。RequestPredicateRouterFunction 中使用,使得开发者可以细粒度地控制请求如何被路由到对应的处理器函数。

ServerRequest

ServerRequest 是对 HTTP 请求的抽象,它提供了访问请求头、参数、body 等信息的方法。在处理器函数中,你可以从 ServerRequest 对象中提取所需的信息来处理请求。ServerRequest 提供了一个反应式的 API 来处理请求数据,支持非阻塞地读取请求体。

ServerResponse

ServerResponse 是对 HTTP 响应的抽象,它允许你构建响应状态、头信息和响应体。使用 ServerResponse 的构建器或静态方法,可以方便地创建各种 HTTP 响应,如设置状态码、添加头信息、设置响应体等。ServerResponse 同样支持非阻塞的响应体写入,使得响应处理能够完全异步和非阻塞进行。

好处

  1. 更简洁的代码:通过消除冗余的注解和配置,代码变得更加简洁明了。
  2. 更好的模块化:函数式风格鼓励将逻辑分解为可重用的函数,从而提高代码的模块化和复用性。
  3. 灵活的路由组合:可以轻松组合和嵌套路由,为复杂应用的路由提供了更大的灵活性。
  4. 更易于测试:纯函数的特性使得编写单元测试更加直接和简单。

示例

下面是一个简单的 Spring Boot 3 函数式 Web 应用示例,展示了如何定义一个路由并处理 HTTP GET 请求。

首先确保你的项目引入了Spring Boot的Web模块依赖到pom.xml文件中:

Maven:

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

接下来,定义一个 handler function 来处理请求:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.web.servlet.function.RequestPredicate;
import org.springframework.web.servlet.function.RouterFunction;
import org.springframework.web.servlet.function.ServerResponse;

import static org.springframework.web.servlet.function.RequestPredicates.accept;
import static org.springframework.web.servlet.function.RouterFunctions.route;


/**
 * @author CoderJia
 * @create 2024/3/15 下午 11:24
 * @Description
 **/
@Configuration
public class GreetingRouter {
    private static final RequestPredicate ACCEPT_JSON = accept(MediaType.APPLICATION_JSON);

    @Bean
    public RouterFunction<ServerResponse> routerFunction(GreetingHandler greetingHandler) {
        return route()
                .GET("/hello", ACCEPT_JSON, greetingHandler::hello)
                .GET("/getData", ACCEPT_JSON, greetingHandler::getData)
                .build();
    }
}

然后,定义一个router function来将请求路由到handler:

import com.coderjia.springboot304web.bean.AClass;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.function.ServerRequest;
import org.springframework.web.servlet.function.ServerResponse;

/**
 * @author CoderJia
 * @create 2024/3/15 下午 11:22
 * @Description
 **/
@Component
public class GreetingHandler {

    public ServerResponse hello(ServerRequest request) {
        String name = request.param("name").get();
        return ServerResponse.ok().body("hello " + name);
    }

    public ServerResponse getData(ServerRequest request) {
        AClass aClass = new AClass();
        aClass.setName("coderjia");
        aClass.setAge(30);
        return ServerResponse.ok().body(aClass);
    }
}

在这个例子中,我们创建了一个 GreetingHandler 类,其中包含一个处理 HTTP GET 请求的方法。然后在 GreetingRouter 类中,我们定义了两个路由,当访问/hello时,将请求路由到GreetingHandlerhello方法,获取请求的参数,并返回字符串。

image-20240315235354956

当访问/getData时,将请求路由到GreetingHandlergetData方法。

image-20240315235501640

使用 RequestPredicate 还可以请求的参数进行各种,且支持组合校验:

image-20240315235853671

结论

Spring Boot 3中的函数式Web编程提供了一种新的、灵活的方式来构建Web应用。通过使用Router Functions和Handler Functions,开发者可以享受到函数式编程带来的诸多好处,如代码简洁、易于测试、灵活的路由定义等。对于习惯于函数式编程范式的开发者来说,这种模型提供了一种更加自然和高效的方式来开发响应式Web应用。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang中map数据结构字段解析

Golang里map底层数据结构具体如下图所示&#xff1a; map其实就是一个指向 hmap 的指针&#xff0c;占用了8个字节 hmap各自段存放的字段意义如下&#xff1a; 字段含义countmap中元素的个数&#xff0c;对应len (map)的值flags状态标志位&#xff0c;标记map的一些状态B桶数…

基于SpringBoot和Echarts的全国地震可视化分析实战

目录 前言 一、后台数据服务设计 1、数据库查询 2、模型层对象设计 3、业务层和控制层设计 二、Echarts前端配置 1、地图的展示 2、次数排名统计 三、最终结果展示 1、地图展示 2、图表展示 总结 前言 在之前的博客中基于SpringBoot和PotsGIS的各省地震震发可视化分…

Hive-技术补充-初识ANTLR

一、背景 要清晰的理解一条Hql是如何编译成MapReduce任务的&#xff0c;就必须要学习ANTLR。下面是ANTLR的官方网址&#xff0c;下面让我们一起来跟着官网学习吧&#xff0c;在学习的过程中我参考了《antlr4权威指南》&#xff0c;你也可以读下这本书&#xff0c;一定会对你有…

Java微服务轻松部署服务器

我们在日常开发微服务之后需要再服务器上面部署&#xff0c;那么如何进行部署呢&#xff0c;先把微服务的各个服务和中间件以及对应的端口列举出来&#xff0c;都打包成镜像&#xff0c;以及前端代码部署的nginx&#xff0c;使用docker-compose启动&#xff0c;访问服务器nginx…

linux板子vscode gdb 远程调试

板子&#xff1a;hi3556v200 交叉编译工具&#xff1a;arm-himix200-linux 主机&#xff1a;win10虚拟机的ubuntu16.4 gdb:gdb-8.2.tar.gz 1.在ubuntu交叉编译gdb&#xff08;Remote g packet reply is too long解决&#xff09; 建议修改gdb8.2/gdb目录下面的remote.c解决…

16.WEB渗透测试--Kali Linux(四)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;15.WEB渗透测试--Kali Linux&#xff08;三&#xff09;-CSDN博客 1.crunch简介与使用 C…

docker实战(3)

1, jdk17版本的dockerfile FROM eclipse-temurin:17-jre ADD ./target/ods-poc-0.0.1-SNAPSHOT.jar /home/app/app.jar WORKDIR /home/app ENV TZ Asia/Shanghai ENTRYPOINT ["java","-jar","/home/app/app.jar"] EXPOSE 8083dockerfile 1, …

神策分析 Copilot 成功通过网信办算法备案,数据分析 AI 化全面落地

近日&#xff0c;神策数据严格遵循《互联网信息服务深度合成管理规定》&#xff0c;已完成智能数据问答算法备案。该算法基于大模型技术&#xff0c;专注于为客户提供数据指标查询和数据洞察方面的专业回答。 神策分析 Copilot 运用神策数据智能数据问答算法&#xff0c;聚焦分…

uni app 打肉肉(打飞机)小游戏

都给老婆和孩子写了 合十 钓鱼了&#xff0c;给自己写个打飞机吧。没找飞机怪兽的图片。就用馒头和肉肉代替了。有问题不要私信我。自己改哈 <template><view class"page_main"><view class"contentone"><canvas class"canvas…

【Session】Tomcat Session 集群

设备 nginx&#xff1a;192.168.67.11 tomcat1&#xff1a;192.168.67.12 tomcat2&#xff1a;192.168.67.13安装nginx &#xff08;192.168.67.11&#xff09; #关闭防火墙和安全机制 [roottest1 ~]# systemctl stop firewalld [roottest1 ~]# setenforce 0#安装epel源 [ro…

iOS面试题锦集

1. 问&#xff1a;一张图片所占内存大小跟什么有关&#xff1f; 图片所占内存大小&#xff0c;与图片的宽高有关 我们平时看到的png、jpg、webp这些图片格式&#xff0c;其实都是图片压缩格式。通过对应的算法来优化了大小以节省网络传输与本地保存所需的资源。 但是当我们加…

【四 (1)数据可视化之如何选用正确的图表】

目录 文章导航一、数据分析中可视化的作用1、揭示数据关联和模式2、支持数据分析和决策3、提升沟通和共享效果4、强调关键信息和发现5、增强故事叙述和记忆效果6、有效增强数据交互性数据7、复杂信息易理解8、数据多维度显示 二、如何选用合适的图表1、简洁性避免使用过于复杂或…

【PTA】​L1-034 点赞(C++)

题目链接&#xff1a; L1-034 点赞 - 团体程序设计天梯赛-练习集 (pintia.cn) 目录&#xff1a; 目录&#xff1a; 题目要求&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 思路&#xff1a; 代码&#xff1a; 测试结果…

git下载及基础

git学习教程&#xff1a;【【GeekHour】一小时Git教程】 https://www.bilibili.com/video/BV1HM411377j/?share_sourcecopy_web&vd_source1a32dd27a726236a74603cf06b7302aa 1. 下载 官网&#xff1a;https://git-scm.com/ 终端输入 git -v 能看到版本信息表示安装成功…

最新开源解密版TwoNav网址导航系统源码

源码简介 2024最新开源解密版TwoNav网址导航系统源码去授权破解版 内置二十多套主题模板。 已去授权&#xff0c;最新开源解密版。TwoNav 是一款开源的书签&#xff08;导航&#xff09;管理程序&#xff0c;使用PHP SQLite 3开发&#xff0c;界面简洁&#xff0c;安装简单&…

【MySQL】4. 表的操作

表的操作 1. 创建表 语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎;说明&#xff1a; field 表示列名 datatype 表示列的类型 character set 字符集&#xff0c…

springcloud:4.1 GateWay

概述 Gateway 简介 Spring Cloud Gateway基于Spring 5.0、SpringBoot 2.0和Project Reactor等技术开发 旨在为微服务架构提供一种简单有效的、统一的API路由管理方式&#xff0c;并为微服务架构提供安全、监控、指标和弹性等功能 其目标是替代Zuul特点 易于编写谓词和过滤器&…

1.2 课程架构介绍:STM32H5 芯片生命周期管理与安全调试

1.2 课程架构介绍&#xff1a;STM32H5 芯片生命周期管理与安全调试 下面开始学习课程的第二节&#xff0c;简单介绍下STM32H5芯片的生命周期和安全调试&#xff0c;具体课程大家可以观看STM32官方录制的课程&#xff0c;链接&#xff1a;1.2. 课程架构介绍&#xff1a;STM32H5…

免费阅读篇 | 芒果YOLOv8改进109:注意力机制SimAM:用于卷积神经网络的简单、无参数注意力模块

免费阅读篇|芒果YOLOv8改进109&#xff1a;注意力机制篇SimAM&#xff1a;用于卷积神经网络的简单、无参数注意力模块 &#x1f4a1;&#x1f680;&#x1f680;&#x1f680;本博客 改进源代码改进 适用于 YOLOv8 按步骤操作运行改进后的代码即可 该专栏完整目录链接&#x…

【AIGC调研系列】通义灵码与copilot的对比

通义灵码与GitHub Copilot的对比主要集中在几个方面&#xff1a;代码编写能力、免费性、操作界面和适配性。 首先&#xff0c;在代码编写能力上&#xff0c;虽然GitHub Copilot在整体上要强于通义灵码&#xff0c;但通义灵码的能力也不算弱&#xff0c;并且在某些特定的小类任…