在 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 |
| 依赖组件 | viewresolver | httpmessageconverter |
| 注解组合 | 无 | @controller + @responsebody |
根据项目需求选择注解:
需要页面渲染用 @controller,纯 api 服务用 @restcontroller。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论