Spring Boot 中的 Spring MVC 支持提供了快速构建高效、灵活 Web 应用的便捷方式。其优点包括:自动配置简化了开发流程,减少 XML 配置;内嵌 Tomcat/Jetty 等服务器实现开箱即用;与 Spring 生态无缝集成(如数据访问、安全);支持 RESTful 风格和多种视图技术(Thymeleaf、JSON 等);通过注解(如 @RestController、@RequestMapping)轻松定义路由和逻辑;提供全局异常处理、参数校验等增强功能;依赖管理通过 Starter 模块一键引入;同时兼容传统 Servlet 和响应式编程,兼顾高性能与可扩展性,显著提升开发效率。
1、Spring MVC的自动配置
Spring Boot 自动配置了以下 Spring MVC 功能:
- 自动注册
DispatcherServlet - 自动配置
ViewResolver(包括 ContentNegotiatingViewResolver, BeanNameViewResolver) - 静态资源支持 (classpath 下的
/static,/public,/resources,/META-INF/resources) - 自动注册
Converter,GenericConverter,Formatterbeans - 支持
HttpMessageConverters(用于 JSON, XML 等) - 自动注册
MessageCodesResolver - 静态
index.html支持 - 自定义 Favicon 支持
- 自动使用
ConfigurableWebBindingInitializer
基本控制器:
java
@RestController
@RequestMapping("/api")
public class HelloController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, Spring Boot MVC!";
}
}
2. 请求映射
Spring MVC 提供了多种注解来处理不同类型的 HTTP 请求:
基本请求映射:
java
@RestController
@RequestMapping("/products")
public class ProductController {
// GET /products
@GetMapping
public List<Product> getAllProducts() {
// 返回所有产品
}
// GET /products/1
@GetMapping("/{id}")
public Product getProductById(@PathVariable Long id) {
// 根据ID返回产品
}
// POST /products
@PostMapping
public Product createProduct(@RequestBody Product product) {
// 创建新产品
}
// PUT /products/1
@PutMapping("/{id}")
public Product updateProduct(@PathVariable Long id, @RequestBody Product product) {
// 更新产品
}
// DELETE /products/1
@DeleteMapping("/{id}")
public void deleteProduct(@PathVariable Long id) {
// 删除产品
}
}
请求参数处理:
java
@GetMapping("/search")
public List<Product> searchProducts(
@RequestParam(required = false) String name,
@RequestParam(defaultValue = "0") double minPrice,
@RequestParam(defaultValue = "1000") double maxPrice) {
// 根据参数搜索产品
}
3、请求和响应处理
请求体绑定
java
@PostMapping("/orders")
public ResponseEntity<Order> createOrder(@Valid @RequestBody Order order) {
Order savedOrder = orderService.save(order);
return ResponseEntity.created(URI.create("/orders/" + savedOrder.getId())).body(savedOrder);
}
响应处理:
java
@GetMapping("/orders/{id}")
public ResponseEntity<?> getOrder(@PathVariable Long id) {
return orderService.findById(id)
.map(order -> ResponseEntity.ok(order))
.orElse(ResponseEntity.notFound().build());
}
4、异常处理
Spring MVC 提供了多种方式来处理异常:
控制器级别的异常处理:
java
@RestController
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ProductNotFoundException.class)
public ResponseEntity<ErrorResponse> handleProductNotFound(ProductNotFoundException ex) {
ErrorResponse error = new ErrorResponse(
"NOT_FOUND",
ex.getMessage(),
LocalDateTime.now()
);
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND);
}
@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleValidationExceptions(MethodArgumentNotValidException ex) {
List<String> errors = ex.getBindingResult()
.getFieldErrors()
.stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.toList();
ErrorResponse error = new ErrorResponse(
"VALIDATION_FAILED",
"Validation failed",
LocalDateTime.now(),
errors
);
return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST);
}
}
5、文件上传
Spring MVC 提供了简单的文件上传支持:
java
@PostMapping("/upload")
public String handleFileUpload(@RequestParam("file") MultipartFile file) {
if (file.isEmpty()) {
return "redirect:/uploadStatus?error=empty";
}
try {
byte[] bytes = file.getBytes();
Path path = Paths.get("uploads/" + file.getOriginalFilename());
Files.write(path, bytes);
return "redirect:/uploadStatus?success";
} catch (IOException e) {
return "redirect:/uploadStatus?error=io";
}
}
6、其他高级功能
异步请求处理:
java
@GetMapping("/async")
public Callable<String> asyncProcessing() {
return () -> {
// 长时间运行的任务
Thread.sleep(2000);
return "Async result";
};
}
CORS 支持:
java
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOrigins("http://example.com")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowCredentials(true)
.maxAge(3600);
}
}
或者使用注解方式:
java
@RestController
@RequestMapping("/api")
@CrossOrigin(origins = "http://example.com", maxAge = 3600)
public class MyController {
// ...
}
内容协商:
Spring Boot 自动支持基于扩展名和 Accept 头的内容协商:
java
@GetMapping(value = "/product/{id}", produces = {
MediaType.APPLICATION_JSON_VALUE,
MediaType.APPLICATION_XML_VALUE
})
public Product getProduct(@PathVariable Long id) {
// ...
}
总结
Spring Boot 的 Spring MVC 支持提供了以下主要优势:
- 自动配置:减少了大量样板配置
- 简化开发:通过注解简化控制器开发
- 灵活扩展:可以轻松覆盖默认配置
- 集成测试:提供强大的测试支持
- 生产就绪:内置健康检查、指标