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 Buffer缓冲区操作与内存管理最佳实践

    Java Buffer缓冲区操作与内存管理最佳实践

    Java NIO的Buffer是数据容器,管理堆/堆外内存,具备position、limit、capacity三大属性,支持读写切换,直接缓冲区I/O快但创建较慢,非直接缓冲区更易管理,根据场景选择合适类型以优化性能,本文给大家介绍Java Buffer缓冲区操作与内存管理最佳实践,感兴趣的朋友一起看看吧
    2025-09-09
  • 从入门到精通详解Java中的RESTful接口开发

    从入门到精通详解Java中的RESTful接口开发

    这篇文章主要为大家详细介绍了Java中的RESTful接口开发的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-12-12
  • 解读@RabbitListener起作用的原理

    解读@RabbitListener起作用的原理

    这篇文章主要介绍了解读@RabbitListener起作用的原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java数组输出的实例代码

    java数组输出的实例代码

    这篇文章主要介绍了java数组输出的实例代码,有需要的朋友可以参考一下
    2013-12-12
  • 浅谈SpringMVC中Interceptor和Filter区别

    浅谈SpringMVC中Interceptor和Filter区别

    这篇文章主要介绍了浅谈SpringMVC中Interceptor和Filter区别,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-04-04
  • springboot使用@Slf4j进行日志的记录步骤详解

    springboot使用@Slf4j进行日志的记录步骤详解

    这篇文章主要介绍了springboot使用@Slf4j进行日志的记录,使用@Slf4j的注解进行日志记录非常方便,本文给大家分享操作步骤,需要的朋友可以参考下
    2023-08-08
  • Spring中接口FactoryBean作用及说明

    Spring中接口FactoryBean作用及说明

    这篇文章主要介绍了Spring中接口FactoryBean作用及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2026-05-05
  • MyBatis Plus如何实现获取自动生成主键值

    MyBatis Plus如何实现获取自动生成主键值

    这篇文章主要介绍了MyBatis Plus如何实现获取自动生成主键值问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 修改IDEA代码左侧折叠线颜色的操作

    修改IDEA代码左侧折叠线颜色的操作

    这篇文章主要介绍了修改IDEA代码左侧折叠线颜色的操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java 中枚举类enum的values()方法的详解

    java 中枚举类enum的values()方法的详解

    这篇文章主要介绍了java 中枚举类enum的values()方法的详解的相关资料,希望通过本文大家能够掌握这部分内容,需要的朋友可以参考下
    2017-09-09

最新评论