Springboot中Controller和RestController的使用及区别

 更新时间:2025年11月21日 09:59:15   作者:IT小鸟鸟  
文章总结了Spring框架中@Controller和@RestController的区别,包括它们的用途、工作机制、使用场景以及底层原理,文章指出,@Controller用于传统的SpringMVC应用,返回视图或数据(需@ResponseBody)

在 Spring 框架中,@Controller 和 @RestController 是用于处理 HTTP 请求的注解,但它们的用途和行为有显著区别:

1. 核心区别

@Controller

  • 用于传统的 Spring MVC 应用,通常返回视图(View)(如 JSP、Thymeleaf 等)。
  • 若需要返回数据(如 JSON/XML),需额外使用 @ResponseBody 注解。

@RestController

  • 是 Spring 4.0 引入的注解,专门用于构建 RESTful Web 服务,直接返回数据(JSON/XML)。
  • 它本质上是 @Controller + @ResponseBody 的组合,自动将返回值序列化为 HTTP 响应体

2. 工作机制对比

@Controller

  • 默认假设方法返回的是视图名称(View Name),由 ViewResolver 解析为具体页面。
  • 若要返回数据,需在方法上添加 @ResponseBody,此时会通过 HttpMessageConverter 将返回值转换为指定格式(如 JSON)。
@Controller
public class MyController {
    @GetMapping("/page")
    public String showPage() {
        return "home"; // 返回视图 home.jsp(或类似)
    }

    @ResponseBody
    @GetMapping("/data")
    public User getUser() {
        return new User("Alice"); // 返回 JSON 数据
    }
}

@RestController

  • 所有方法默认添加了 @ResponseBody直接返回数据,无需视图解析。
  • 适合 API 开发,不涉及页面渲染。
@RestController
public class MyRestController {
    @GetMapping("/api/user")
    public User getUser() {
        return new User("Bob"); // 自动转换为 JSON
    }
}

3. 使用场景

@Controller

  • 适用于需要混合视图和少量数据返回的传统 Web 应用(如前后端未分离的场景)。

@RestController

  • 专为 RESTful API 设计,适用于前后端分离架构,仅返回数据(如 JSON/XML)。

4. 底层原理

  • @Controller 依赖 ViewResolver 解析视图,而 @RestController 依赖 HttpMessageConverter 转换数据。
  • @RestController 的源码定义如下,可以看出它是 @Controller 的增强版:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {}

总结

特性@Controller@RestController
返回类型视图(默认)或数据(需 @ResponseBody)直接返回数据
适用场景传统 MVC 页面渲染RESTful API
依赖组件ViewResolverHttpMessageConverter
注解组合@Controller + @ResponseBody

根据项目需求选择注解:

需要页面渲染用 @Controller,纯 API 服务用 @RestController

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于java SSM springboot实现景区行李寄存管理系统

    基于java SSM springboot实现景区行李寄存管理系统

    这篇文章主要介绍了基于java SSM springboot实现的景区行李寄存管理系统,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-08-08
  • 学生视角手把手带你写Java 线程池改良版

    学生视角手把手带你写Java 线程池改良版

    作者是一个来自河源的大三在校生,以下笔记都是作者自学之路的一些浅薄经验,如有错误请指正,将来会不断的完善笔记,帮助更多的Java爱好者入门
    2022-03-03
  • Spring Task定时任务的配置和使用详解

    Spring Task定时任务的配置和使用详解

    本篇文章主要介绍了Spring Task定时任务的配置和使用详解,实例分析了Spring Task定时任务的配置和使用的技巧,非常具有实用价值,需要的朋友可以参考下
    2017-04-04
  • SpringBoot+STOMP协议实现私聊、群聊

    SpringBoot+STOMP协议实现私聊、群聊

    本文将结合实例代码,介绍SpringBoot+STOMP协议实现私聊、群聊,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • Java中打jar包以及如何调用包方法演示

    Java中打jar包以及如何调用包方法演示

    这篇文章主要给大家介绍了关于Java中打jar包以及如何调用包的相关资料,jar包的全称是java archive,jar包本质就是一种压缩包,在Java开发中一般是用来压缩类的一个包,需要的朋友可以参考下
    2023-09-09
  • JavaCV 拉流存储到本地示例解析

    JavaCV 拉流存储到本地示例解析

    这篇文章主要介绍了JavaCV 拉流存储到本地示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • Java的break语句最佳实践

    Java的break语句最佳实践

    break 是 Java 等主流语言中的控制流语句,用于立即终止当前执行块并跳转到后续代码,本文给大家介绍Java的break语句最佳实践记录,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • JavaWeb实现文件上传与下载实例详解

    JavaWeb实现文件上传与下载实例详解

    在Web应用程序开发中,文件上传与下载功能是非常常用的功能,下面通过本文给大家介绍JavaWeb实现文件上传与下载实例详解,对javaweb文件上传下载相关知识感兴趣的朋友一起学习吧
    2016-02-02
  • java调用shell命令并获取执行结果的示例

    java调用shell命令并获取执行结果的示例

    今天小编就为大家分享一篇java调用shell命令并获取执行结果的示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • SpringBoot 整合 Netty 多端口监听的操作方法

    SpringBoot 整合 Netty 多端口监听的操作方法

    Netty提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序,是目前最流行的 NIO 框架,这篇文章主要介绍了SpringBoot 整和 Netty 并监听多端口,需要的朋友可以参考下
    2023-10-10

最新评论