第三十四讲-HandlerMapping与HandlerAdapter-2
第三十四讲-HandlerMapping与HandlerAdapter-2
这一讲,我们来了解一下RouterFunctionMapping和HandlerFunctionAdapter。
RouterFunctionMapping
和HandlerFunctionAdapter
是在Spring5.2版本引入的,算是一对比较新的实现。
1. RouterFunctionMapping
RouterFunctionMapping
是在初始化的时候,收集容器中所有的RouterFunction,这个RouterFunction包含两个部分:
- RequestPredicate: 设置映射条件,例如请求路径,请求方式等
- HandlerFuntion: 包含对于请求和响应的逻辑
在请求到达以后,首先根据RequestPredicate匹配条件,根据条件去找到后面的HandlerFunction。这个HandlerFunction就是处理器。
2. HandlerFunctionAdapter
谁来执行上面所说的处理器呢?就是HandlerFunctionAdapter
适配器来调用handler处理器
下面呢,我们看一下这组新的API的用法:
@Configuration
public class WebConfig {
@Bean // ⬅️内嵌 web 容器工厂
public TomcatServletWebServerFactory servletWebServerFactory() {
return new TomcatServletWebServerFactory(8080);
}
@Bean // ⬅️创建 DispatcherServlet
public DispatcherServlet dispatcherServlet() {
return new DispatcherServlet();
}
@Bean // ⬅️注册 DispatcherServlet, Spring MVC 的入口
public DispatcherServletRegistrationBean servletRegistrationBean(DispatcherServlet dispatcherServlet) {
return new DispatcherServletRegistrationBean(dispatcherServlet, "/");
}
// 创建一个 RouterFunctionMapping 对象
@Bean
public RouterFunctionMapping routerFunctionMapping() {
return new RouterFunctionMapping();
}
// 创建一个 HandlerFunctionAdapter 对象
@Bean
public HandlerFunctionAdapter handlerFunctionAdapter() {
return new HandlerFunctionAdapter();
}
// 处理器1-->匹配GET请求,且路由为/r1,
@Bean
public RouterFunction<ServerResponse> r1() {
return route(GET("/r1"), request -> ok().body("this is r1"));
}
// 处理器2
@Bean
public RouterFunction<ServerResponse> r2() {
return route(GET("/r2"), request -> ok().body("this is r2"));
}
}
编写主方法:
public class A34 {
public static void main(String[] args) {
AnnotationConfigServletWebServerApplicationContext context =
new AnnotationConfigServletWebServerApplicationContext(WebConfig.class);
/*
学到了什么
函数式控制器
a. RouterFunctionMapping, 通过 RequestPredicate 映射
b. handler 要实现 HandlerFunction 接口
c. HandlerFunctionAdapter, 调用 handler
对比
a. RequestMappingHandlerMapping, 以 @RequestMapping 作为映射路径
b. 控制器的具体方法会被当作 handler
c. RequestMappingHandlerAdapter, 调用 handler
*/
}
}
测试结果如下:
我们来总结一下执行流程:
-
RouterFunction会从容器中找到所有路由域处理器之间的映射,并记录下来
-
将来请求到来的时候,根据请求的各个信息(如请求路径、请求方式等)去跟每个条件进行匹配。
-
一旦匹配成功,就找到对应的处理器对象。
-
接下来由HandlerFunctionAdapter对象来调用找到的处理器对象。
-
最后由HandlerFunctionAdapter返回响应给浏览器。
分类:
Spring 高级49讲
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构