这些 HandlerMapping
是 Spring 框架中不同类型的请求映射实现,用于将 HTTP 请求与合适的处理器(Handler
)进行匹配。它们在功能和使用场景上各有不同,下面是对它们的详细介绍。
1. PropertySourcedRequestMappingHandlerMapping
- 介绍:这是 Spring Boot 特有的
HandlerMapping
实现,主要用于处理那些通过属性文件动态配置的请求映射。它允许根据外部化的配置文件(如application.properties
或application.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
实现各自适应不同的需求和使用场景:
- 动态配置和管理:
PropertySourcedRequestMappingHandlerMapping
和WebMvcEndpointHandlerMapping
主要用于 Spring Boot 和 Actuator 中的端点处理。 - 静态资源与欢迎页:
WelcomePageHandlerMapping
自动映射欢迎页面。 - 注解与函数式编程:
RequestMappingHandlerMapping
是基于注解的映射,而RouterFunctionMapping
则适用于函数式编程风格的映射。 - 简单映射:
SimpleUrlHandlerMapping
和BeanNameUrlHandlerMapping
提供了简单的 URL 到处理器的映射机制。
这些 HandlerMapping
为 Spring 提供了灵活的请求处理机制,适用于不同的应用场景。