В чем разница между аннотациями @Controller и @RestController в Spring?

«В чем разница между аннотациями @Controller и @RestController в Spring?» — вопрос из категории Spring, который задают на 29% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обе аннотации отмечают класс как компонент, обрабатывающий HTTP-запросы, но предназначены для разных архитектурных стилей.

Аспект @Controller @RestController
Назначение Часть паттерна MVC (Model-View-Controller). Для создания RESTful веб-сервисов (API).
Возвращаемое значение Имя представления (view), например, "home.html". Данные (объект), которые сериализуются в JSON/XML и отправляются в теле HTTP-ответа.
Аннотации по умолчанию Только @Controller. @Controller + @ResponseBody на уровне класса.
Типичный Content-Type text/html (для рендеринга HTML). application/json.

Пример @Controller (MVC с представлением):

@Controller
public class WebController {
    @GetMapping("/greeting")
    public String greeting(Model model) {
        model.addAttribute("name", "World");
        return "greeting"; // Имя шаблона (greeting.html)
    }

    @GetMapping("/api/old")
    @ResponseBody // Без этого вернется строка как имя шаблона
    public String getData() {
        return "Data";
    }
}

Пример @RestController (REST API):

@RestController
@RequestMapping("/api/users")
public class UserApiController {
    @GetMapping
    public List<User> getAllUsers() {
        // Автоматически конвертируется в JSON
        return userService.findAll();
    }

    @PostMapping
    public ResponseEntity<User> createUser(@RequestBody User user) {
        User saved = userService.save(user);
        return ResponseEntity.created(URI.create("/api/users/" + saved.getId())).body(saved);
    }
}

Вывод: Используйте @Controller для server-side рендеринга HTML, а @RestController — для построения JSON/XML API.