Что такое аннотация @Controller в Spring MVC?

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

Ответ

@Controller — это стереотипная аннотация Spring MVC, которая помечает класс как компонент веб-уровня (контроллер). Её основная задача — обрабатывать HTTP-запросы от клиентов и возвращать ответы.

Роль и особенности:

  1. Является специализацией аннотации @Component, поэтому класс сканируется и управляется контейнером Spring как бин.
  2. Работает в паре с аннотацией @RequestMapping (или её производными, такими как @GetMapping, @PostMapping) для маппинга URL-путей на методы класса.
  3. Методы контроллера обычно возвращают имя логического представления (View name) или данные, которые будут преобразованы в ответ (JSON, XML) с помощью @ResponseBody или аннотации @RestController.

Пример классического контроллера, возвращающего имя представления:

@Controller
@RequestMapping("/users")
public class UserController {

    @GetMapping("/{id}")
    public String getUserProfile(@PathVariable Long id, Model model) {
        User user = userService.findById(id);
        model.addAttribute("user", user); // Добавляем данные в модель для представления
        return "user-profile"; // Имя view (например, user-profile.jsp или user-profile.html)
    }
}

Пример контроллера, работающего как REST API (до появления @RestController):

@Controller
@RequestMapping("/api/users")
public class UserApiController {

    @GetMapping("/{id}")
    @ResponseBody // Указывает, что возвращаемое значение должно быть записано прямо в тело HTTP-ответа
    public User getUser(@PathVariable Long id) {
        return userService.findById(id); // Объект User будет автоматически преобразован в JSON
    }
}

@Controller vs @RestController:

  • @RestController — это комбинация @Controller и @ResponseBody. Все методы в классе, помеченном @RestController, по умолчанию возвращают данные, а не имена представлений.
  • @Controller используется для традиционных веб-приложений с серверным рендерингом (MVC), в то время как @RestController предназначен для создания RESTful веб-сервисов.