Springboot中Controller和RestController的区别

在 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值