不同的HandlerMapping

这些 HandlerMapping 是 Spring 框架中不同类型的请求映射实现,用于将 HTTP 请求与合适的处理器(Handler)进行匹配。它们在功能和使用场景上各有不同,下面是对它们的详细介绍。

1. PropertySourcedRequestMappingHandlerMapping

  • 介绍:这是 Spring Boot 特有的 HandlerMapping 实现,主要用于处理那些通过属性文件动态配置的请求映射。它允许根据外部化的配置文件(如 application.propertiesapplication.yml)来动态设置请求路径。
  • 作用:主要用于 Spring Boot 中的某些 Actuator 端点或类似需要动态配置 URL 的场景。

示例
假设通过外部配置将某个端点的路径设定为动态属性,这种情况下 PropertySourcedRequestMappingHandlerMapping 会从属性文件中读取并映射请求。

2. WebMvcEndpointHandlerMapping

  • 介绍:这是 Spring Boot Actuator 中专门用于处理 Web MVC 模式下的监控和管理端点(如健康检查、环境信息、应用状态等)的 HandlerMapping。它提供了对 /actuator 及其子路径的处理。
  • 作用:用于将 Actuator 提供的各种监控端点映射到对应的 HTTP 请求。例如,健康检查可以映射到 /actuator/health

示例

  • /actuator/health:返回应用的健康状态
  • /actuator/metrics:提供应用的指标信息

3. ControllerEndpointHandlerMapping

  • 介绍:这是 Spring Boot Actuator 中的另一种 HandlerMapping,用于处理那些通过 @ControllerEndpoint 注解的控制器。与 WebMvcEndpointHandlerMapping 不同,ControllerEndpointHandlerMapping 用于定义完全由开发者自定义的管理端点。
  • 作用:它允许你定义自定义的控制器端点作为应用管理的一部分,可以与 Actuator 其他端点整合。

示例

@ControllerEndpoint(id = "custom")
public class CustomControllerEndpoint {
    @GetMapping("/custom/info")
    public ResponseEntity<String> customInfo() {
        return ResponseEntity.ok("Custom Info");
    }
}

这会将 /actuator/custom/info 请求映射到 customInfo 方法。

4. RequestMappingHandlerMapping

  • 介绍:这是 Spring MVC 中最常用的 HandlerMapping,用于处理使用 @RequestMapping 及其衍生注解(如 @GetMapping@PostMapping)标注的方法。它通过注解方式将 URL 和 HTTP 方法映射到控制器方法上。
  • 作用:处理基于注解的请求映射,特别是在 REST API 或 Web 应用中使用频繁。

示例

@GetMapping("/users")
public List<User> getUsers() {
    return userService.getAllUsers();
}

该请求会映射到 /users 上的 GET 请求。

5. WelcomePageHandlerMapping

  • 介绍:这是 Spring Boot 中用于处理欢迎页面(welcome page)的 HandlerMapping。当应用启动时,如果在应用的静态资源目录(如 src/main/resources/static/)下存在 index.html 文件,WelcomePageHandlerMapping 会自动将根路径 / 映射到该文件。
  • 作用:用于自动处理静态资源文件作为欢迎页面,无需手动配置。

示例
如果项目的 src/main/resources/static/ 目录中有一个 index.html,它会被自动映射到根路径 /

6. BeanNameUrlHandlerMapping

  • 介绍:通过请求 URL 直接映射到 Spring 容器中 Bean 名称的 HandlerMapping。这个映射方式比较简单,但在复杂项目中使用较少。
  • 作用:主要是将 URL 直接映射到对应的 Bean 名称。

示例

@Controller("/myHandler")
public class MyHandler {
    // 处理逻辑
}

/myHandler 请求会直接映射到 MyHandler Bean。

7. RouterFunctionMapping

  • 介绍:这是 Spring 5 引入的基于函数式编程风格的 HandlerMapping,用于响应式 Web 应用中的请求映射。在 WebFlux 中,使用函数式路由来代替传统的注解式映射。
  • 作用:允许开发者使用函数式 API 来定义请求映射,适用于响应式应用或需要灵活定义路由的场景。

示例

RouterFunction<ServerResponse> route = RouterFunctions.route()
    .GET("/users", request -> ServerResponse.ok().body(userService.getAllUsers()))
    .build();

这个配置将 /users GET 请求映射到相应的处理函数。

8. SimpleUrlHandlerMapping

  • 介绍:这是 Spring 提供的基于 URL 路径的 HandlerMapping,通常用于 XML 或 Java 配置,特别是静态资源或简单 URL 映射场景。
  • 作用:通过简单的配置将 URL 映射到某个处理器(通常是控制器或视图)。

示例(基于 XML 配置):

<bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/welcome">welcomeController</prop>
        </props>
    </property>
</bean>

<bean id="welcomeController" class="com.example.WelcomeController" />

在这个例子中,/welcome 请求会映射到 WelcomeController

总结

这些 HandlerMapping 实现各自适应不同的需求和使用场景:

  • 动态配置和管理PropertySourcedRequestMappingHandlerMappingWebMvcEndpointHandlerMapping 主要用于 Spring Boot 和 Actuator 中的端点处理。
  • 静态资源与欢迎页WelcomePageHandlerMapping 自动映射欢迎页面。
  • 注解与函数式编程RequestMappingHandlerMapping 是基于注解的映射,而 RouterFunctionMapping 则适用于函数式编程风格的映射。
  • 简单映射SimpleUrlHandlerMappingBeanNameUrlHandlerMapping 提供了简单的 URL 到处理器的映射机制。

这些 HandlerMapping 为 Spring 提供了灵活的请求处理机制,适用于不同的应用场景。

HandlerMapping是Spring MVC框架中的一个接口,用于将HTTP请求映射到处理程序(即控制器)。 以下是HandlerMapping接口的源代码: ``` public interface HandlerMapping { String BEST_MATCHING_HANDLER_ATTRIBUTE = HandlerMapping.class.getName() + ".bestMatchingHandler"; @Nullable HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception; @Nullable default HandlerExecutionChain getHandler(HttpServletRequest request, boolean cache) throws Exception { if (cache) { Object handler = request.getAttribute(BEST_MATCHING_HANDLER_ATTRIBUTE); if (handler != null) { return (HandlerExecutionChain) handler; } } HandlerExecutionChain handler = getHandler(request); if (cache && handler != null) { request.setAttribute(BEST_MATCHING_HANDLER_ATTRIBUTE, handler); } return handler; } @Nullable default HandlerExecutionChain getHandlerInternal(HttpServletRequest request) throws Exception { return getHandler(request, true); } } ``` 该接口中定义了三个方法: 1. `getHandler(HttpServletRequest request)`:根据HTTP请求返回与之匹配的HandlerExecutionChain,如果没有匹配的则返回null。 2. `getHandler(HttpServletRequest request, boolean cache)`:根据HTTP请求返回与之匹配的HandlerExecutionChain,如果cache为true,则在request属性中查找是否已经缓存对应的HandlerExecutionChain,如果存在则直接返回。如果不存在则调用`getHandler(HttpServletRequest request)`方法,并将其缓存到request属性中。 3. `getHandlerInternal(HttpServletRequest request)`:该方法是`getHandler(HttpServletRequest request)`方法的默认实现,它会调用`getHandler(HttpServletRequest request, boolean cache)`方法,并将cache参数设置为true。 在Spring MVC中,有多种HandlerMapping的实现,如`RequestMappingHandlerMapping`、`SimpleUrlHandlerMapping`、`BeanNameUrlHandlerMapping`等。不同HandlerMapping实现有不同的匹配规则和优先级,开发者可以根据自己的需要进行选择和配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值