Spring 5的RouterFunction函数式编程模式

前言

正常Spring框架提供了两种http的请求方式,一种是基于大家经常使用的@Controller,或者在Restful请求风格用到的@RestContoller注解,以及@RequestMapping、 @GetMapping、@PostMapping进行请求;

RouterFunction属于Spring Web MVC的一种函数式的接口请求模式,用函数的方式用于路由、处理请求,相当于Http的请求方式交给了HandlerFunction (函数处理器)来处理, 当然也是基于MVC的核心控制器DispatcherServlet的基础上的; 当然也支持创建多个HandlerFunction,方便请求多个接口;

RouterFunction路由

拿一个示例代码来看下吧,这段代码是通过RouterFunction进行Swagger的组件访问,通过路由的方式进行Swagger的接口访问;

less 复制代码
@Configuration
public class RouterFunctionConfiguration
{
    @Autowired
    private SwaggerResourceHandler swaggerResourceHandler;
    @Autowired
    private SwaggerSecurityHandler swaggerSecurityHandler;
    @Autowired
    private SwaggerUiHandler swaggerUiHandler;

    @SuppressWarnings("rawtypes")
    @Bean
    public RouterFunction routerFunction()
    {
        return RouterFunctions
                .route(RequestPredicates.GET("/swagger-resources")
                        .and(RequestPredicates.accept(MediaType.ALL)), swaggerResourceHandler)
                .andRoute(RequestPredicates.GET("/swagger-resources/configuration/ui")
                        .and(RequestPredicates.accept(MediaType.ALL)), swaggerUiHandler)
                .andRoute(RequestPredicates.GET("/swagger-resources/configuration/security")
                        .and(RequestPredicates.accept(MediaType.ALL)),swaggerSecurityHandler);
    }

Route构建

RouterFunctions.route 提供了直接创建路由的方法,方便快捷的builder,post、get请求创建映射,无需自己编写路由函数,通过andRoute方法,可以进行路由的追加;

看这两个方法,分别是GET请求类型,夹杂着accept方法,里面MediaType类,可以看到都是构建一个http请求头里面的一些参数;

less 复制代码
RequestPredicates.GET(url)
RequestPredicates.accept(MediaType.ALL)

HandlerFunction函数处理类

HandlerFunction有请求ServerRequest和返回ServerResponse,分别对接口进行Http请求和返回;

  • ServerRequest 本质上就是一个Http请求接口,有url、header、body、还有入参param;
  • ServerResponse
scss 复制代码
public Mono<ServerResponse> handle(ServerRequest serverRequest) {
	return ServerResponse.status(HttpStatus.OK)
			.contentType(MediaType.APPLICATION_JSON)
			.body(BodyInserters.fromValue(
					Optional.ofNullable(uiConfiguration)
							.orElse(UiConfigurationBuilder.builder().build())));
}
* 

提供响应状态、响应类型、响应体;

  • Handler处理类 可以实现HandlerFunction接口,重写handle方法,然后在构建route路由的时候,将该handler传进去'

Filter过滤器

Filter过滤方法,也是在HandlerFunction处理的过程中,通过filter()方法对ServerRequest的请求参数进行判断过滤; beforeafter方法分别可以设置headler请求头里面的参数,和对ServerResponse返回结果进行处理,有没有很熟悉,就是一个servlet容器

HandlerMapping映射

底层使用的是DispatcherServlet,自然少不了HandlerMapping映射,找到对应的controller; RouterFunctionMapping 这里是通过RouterFunction.andRoute组合请求; HandlerFunctionAdapter在Spring MVC的执行流程上,自然也少不了适配器,HandlerFunctionAdapter实现基类HandlerAdapter适配,主要用来接受不了mapping映射,返回handler,经过适配器的解析最终执行方法;

总结

这种请求模式也被称为函数式WEB,只是实现了另外一种风格的MVC,也将会是未来发展的一种趋势,比如WebFlux;

相关推荐
腾渊信息科技公司21 分钟前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地1 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
IT_陈寒1 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
段一凡-华北理工大学2 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
码事漫谈2 小时前
1999年的电商前夜和2026年的AI前夜 历史押韵但从不重复
后端
Conan在掘金3 小时前
鸿蒙报错速查:arkts-strict-typing Property does not exist on type 'object',object 装函数就炸,根因 + 真解法
后端
颜酱3 小时前
01 | 骨架搭建:FastAPI + Vue 跑通第一个 SSE 流式问答
前端·人工智能·后端
程序员cxuan4 小时前
Grok Build 被众人唾骂,结果老马把它开源了
人工智能·后端·程序员
莫逸风4 小时前
【AgentScope 2.0】 0. 学习指南
java·llm·agent·agentscope
从零开始的代码生活_4 小时前
C++ 继承详解:访问控制、对象模型、菱形继承与设计取舍
开发语言·c++·后端·学习·算法