重学SpringBoot3-函数式Web

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

随着响应式编程范式的兴起和 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应用。

  • 23
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
Springboot CAS-Client 是一个基于Springboot框架集成CAS(Central Authentication Service)的客户端。 CAS是一种单点登录(Single Sign-On)协议,它允许用户在一次登录后就能够访问多个应用,而无需重新认证。 Springboot CAS-Client 的作用是充当CAS服务端和应用系统之间的中间件,它负责向CAS服务端发送认证请求,并根据认证结果来管理用户的登录状态。 为了集成CAS,我们首先需要在Springboot项目中引入相应的依赖,例如spring-boot-starter-webspring-boot-starter-security。接着,我们需要配置CAS服务端的地址信息,包括CAS服务端的登录URL、登出URL以及验证票据的URL等。 在Springboot CAS-Client中,我们也可以自定义一些过滤器和拦截器来实现相关的功能。例如,我们可以编写一个CAS认证过滤器来拦截所有的请求,并判断用户的登录状态。如果用户未登录,则跳转到CAS服务端进行认证;如果用户已登录,则直接放行请求。此外,我们还可以编写一个CAS登出拦截器来处理用户的登出请求,并在登出完成后将用户重定向到指定的页面。 总的来说,Springboot CAS-Client 提供了一个简洁、灵活的方来集成CAS协议,使得我们的Springboot应用能够享受到单点登录带来的便利。通过它,我们可以轻松地实现用户认证、登录状态管理以及注销等功能,提升用户体验并提高开发效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CoderJia_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值