首页
/ 深入理解Spring框架中的@Controller与@RestController

深入理解Spring框架中的@Controller与@RestController

2025-06-25 16:47:37作者:郜逊炳

前言

在Spring框架中,控制器(Controller)是处理客户端请求的核心组件。Spring提供了两种主要的控制器注解:@Controller@RestController。本文将深入探讨这两种注解的区别、使用场景以及它们背后的工作机制。

基本概念

@Controller注解

@Controller是Spring MVC框架中的传统控制器注解,主要用于构建传统的Web应用程序。它的主要特点是:

  1. 基于视图(View)的返回机制
  2. 通常与模板引擎(如Thymeleaf、JSP等)配合使用
  3. 返回的是视图名称,由视图解析器(ViewResolver)解析为具体的视图

@RestController注解

@RestController是Spring 4.0引入的注解,专门用于构建RESTful Web服务。它的特点是:

  1. 直接返回数据对象,而不是视图
  2. 自动将返回对象序列化为JSON或XML格式
  3. 实际上是@Controller@ResponseBody的组合注解

源码分析

让我们从源码层面看看这两个注解的定义:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Component
public @interface Controller {
    // ...
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {
    // ...
}

从源码可以看出:

  • @Controller本身带有@Component注解,会被Spring容器识别为Bean
  • @RestController则是在@Controller基础上增加了@ResponseBody注解

工作流程对比

@Controller的工作流程

  1. 客户端发送HTTP请求
  2. DispatcherServlet接收请求并查找对应的处理器映射(HandlerMapping)
  3. HandlerMapping确定处理请求的Controller方法
  4. Controller处理请求后返回视图名称
  5. DispatcherServlet通过ViewResolver解析视图名称
  6. 最终渲染视图并返回给客户端

@RestController的工作流程

  1. 客户端发送HTTP请求
  2. DispatcherServlet接收请求并查找对应的处理器映射(HandlerMapping)
  3. HandlerMapping确定处理请求的Controller方法
  4. Controller处理请求后直接返回数据对象
  5. 对象通过HttpMessageConverter自动序列化为JSON/XML
  6. 序列化后的数据直接写入HTTP响应体

使用场景对比

适合使用@Controller的场景

  • 需要返回HTML页面的传统Web应用
  • 需要服务器端渲染的应用
  • 需要与模板引擎配合使用的场景
  • 需要重定向或转发到其他视图的情况

适合使用@RestController的场景

  • 构建RESTful API服务
  • 前后端分离架构中的后端服务
  • 需要返回JSON/XML数据的场景
  • 移动应用或第三方系统集成的接口

进阶技巧

在@Controller中使用@ResponseBody

即使使用@Controller,也可以在方法上添加@ResponseBody注解来实现类似@RestController的效果:

@Controller
public class HybridController {
    
    @ResponseBody
    @GetMapping("/api/data")
    public Data getData() {
        return new Data();
    }
    
    @GetMapping("/page")
    public String getPage() {
        return "page";
    }
}

使用ResponseEntity

@RestController虽然方便,但有时我们需要更精确地控制HTTP响应。这时可以使用ResponseEntity

@RestController
public class ApiController {
    
    @GetMapping("/data")
    public ResponseEntity<Data> getData() {
        Data data = service.getData();
        return ResponseEntity.ok()
                .header("Custom-Header", "value")
                .body(data);
    }
}

常见问题解答

Q: 为什么我的@RestController方法返回的字符串没有被解析为视图?

A: 这正是@RestController的设计目的。它会将返回值直接写入响应体,而不是解析为视图名称。如果需要返回视图,应该使用@Controller

Q: 可以在同一个类中同时使用@Controller和@RestController吗?

A: 技术上可以,但不推荐。这会导致代码逻辑混乱,建议根据类的职责选择一种注解。

Q: @RestController能处理表单提交吗?

A: 可以,但通常@Controller更适合处理表单提交,因为它可以方便地重定向到结果页面。

总结

@Controller@RestController是Spring框架中处理HTTP请求的两种主要方式,它们各有适用场景:

  • 选择@Controller:当需要服务器端渲染、返回HTML视图时
  • 选择@RestController:当构建RESTful API、返回JSON/XML数据时

理解它们的工作原理和区别,有助于我们在开发Spring应用时做出更合适的选择。在实际项目中,根据应用架构和需求合理使用这两种注解,可以大大提高开发效率和代码质量。

登录后查看全文
热门项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
22
6
docsdocs
OpenHarmony documentation | OpenHarmony开发者文档
Dockerfile
132
1.89 K
nop-entropynop-entropy
Nop Platform 2.0是基于可逆计算理论实现的采用面向语言编程范式的新一代低代码开发平台,包含基于全新原理从零开始研发的GraphQL引擎、ORM引擎、工作流引擎、报表引擎、规则引擎、批处理引引擎等完整设计。nop-entropy是它的后端部分,采用java语言实现,可选择集成Spring框架或者Quarkus框架。中小企业可以免费商用
Java
8
0
ohos_react_nativeohos_react_native
React Native鸿蒙化仓库
C++
193
273
金融AI编程实战金融AI编程实战
为非计算机科班出身 (例如财经类高校金融学院) 同学量身定制,新手友好,让学生以亲身实践开源开发的方式,学会使用计算机自动化自己的科研/创新工作。案例以量化投资为主线,涉及 Bash、Python、SQL、BI、AI 等全技术栈,培养面向未来的数智化人才 (如数据工程师、数据分析师、数据科学家、数据决策者、量化投资人)。
Jupyter Notebook
70
63
openHiTLSopenHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
379
389
Cangjie-ExamplesCangjie-Examples
本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
344
1.24 K
RuoYi-Vue3RuoYi-Vue3
🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
915
548
openGauss-serveropenGauss-server
openGauss kernel ~ openGauss is an open source relational database management system
C++
144
189
ShopXO开源商城ShopXO开源商城
🔥🔥🔥ShopXO企业级免费开源商城系统,可视化DIY拖拽装修、包含PC、H5、多端小程序(微信+支付宝+百度+头条&抖音+QQ+快手)、APP、多仓库、多商户、多门店、IM客服、进销存,遵循MIT开源协议发布、基于ThinkPHP8框架研发
JavaScript
96
15