第三十四讲-HandlerMapping与HandlerAdapter-2

第三十四讲-HandlerMapping与HandlerAdapter-2

这一讲,我们来了解一下RouterFunctionMapping和HandlerFunctionAdapter。

RouterFunctionMappingHandlerFunctionAdapter是在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
         */
    }
}

测试结果如下:

image-20240819193310565

image-20240819193324472

我们来总结一下执行流程:

  1. RouterFunction会从容器中找到所有路由域处理器之间的映射,并记录下来

  2. 将来请求到来的时候,根据请求的各个信息(如请求路径、请求方式等)去跟每个条件进行匹配。

  3. 一旦匹配成功,就找到对应的处理器对象。

  4. 接下来由HandlerFunctionAdapter对象来调用找到的处理器对象。

  5. 最后由HandlerFunctionAdapter返回响应给浏览器。

posted @   LilyFlower  阅读(6)  评论(0编辑  收藏  举报
编辑推荐:
· .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语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示