第三十四讲-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返回响应给浏览器。

浙公网安备 33010602011771号