地基注解@Controller和@RestController区别
前记:基础啊,区别点重点理解;
在Spring和Spring Boot框架中,@Controller和@RestController都用于处理HTTP请求,但它们在设计目的和用法上有显著区别。以下是它们的核心区别及示例说明:
1. 核心区别
| 特性 | @Controller | @RestController | 
|---|---|---|
| 用途 | 传统Web应用(返回视图名称) | RESTful API(直接返回数据,如JSON/XML) | 
| 响应处理 | 默认返回视图名称,需配合@ResponseBody返回数据 | 自动将返回值序列化为HTTP响应体(内置@ResponseBody) | 
| 视图解析器 | 需要视图解析器(如JSP、Thymeleaf) | 不需要视图解析器,直接返回数据 | 
| 组合注解 | 无 | @Controller + @ResponseBody | 
2. @Controller 用法示例
场景:传统Web应用,返回HTML视图。
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class WebController {
    
    // 返回视图名称(由视图解析器处理,如Thymeleaf)
    @GetMapping("/home")
    public String home() {
        return "home"; // 对应src/main/resources/templates/home.html
    }
    // 需要显式添加@ResponseBody返回数据
    @GetMapping("/data")
    @ResponseBody
    public String getData() {
        return "Hello from @Controller!";
    }
} 
说明:
return "home":视图解析器会查找home.html模板并渲染。@ResponseBody:强制将返回值作为响应体(不经过视图解析器)。
3. @RestController 用法示例
场景:REST API,直接返回JSON数据。
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class ApiController {
    // 自动将User对象序列化为JSON
    @GetMapping("/user")
    public User getUser() {
        return new User("Alice", 30);
    }
    // 直接返回字符串
    @GetMapping("/greeting")
    public String greeting() {
        return "Hello from @RestController!";
    }
}
// 简单POJO类
class User {
    private String name;
    private int age;
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
    // 省略getter/setter
} 
说明:
- 所有方法默认使用
@ResponseBody,返回值直接写入HTTP响应体。 - 返回对象会被自动序列化为JSON(需Jackson库支持,Spring Boot默认包含)。
 
4. 关键总结
-  
使用
@Controller时:- 适合需要服务端渲染的页面(如JSP、Thymeleaf)。
 - 若返回数据,必须配合
@ResponseBody。 
 -  
使用
@RestController时:- 专为REST API设计,直接返回数据(无需视图解析)。
 - 简化代码,避免重复使用
@ResponseBody。 
 
5. 常见HTTP方法注解
两者均可使用@GetMapping、@PostMapping等快捷注解:
// 在@Controller或@RestController中均可使用
@PostMapping("/create")
public ResponseEntity<String> createUser(@RequestBody User user) {
    // 处理创建逻辑
    return ResponseEntity.ok("User created!");
} 
通过合理选择@Controller和@RestController,可以高效构建传统Web应用或现代RESTful API。
(望各位潘安、各位子健/各位彦祖、于晏不吝赐教!多多指正!🙏)
