Может ли в Spring существовать контроллер без аннотации @Controller?

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

Ответ

Да, может. Spring распознает класс как контроллер, если он:

  1. Является бином (помечен стереотипной аннотацией @Component).
  2. Имеет методы, аннотированные @RequestMapping или его производными (@GetMapping, @PostMapping и т.д.).

Основные альтернативы @Controller:

  • @RestController – наиболее частый вариант. Это мета-аннотация, объединяющая @Controller и @ResponseBody. Все методы по умолчанию возвращают данные, а не имя представления.
    @RestController // Заменяет @Controller + @ResponseBody
    public class ApiController {
        @GetMapping("/hello")
        public String hello() {
            return "Hello World"; // Возвращает JSON/текст, а не имя view
        }
    }
  • Прямая регистрация бина – класс можно пометить как @Component и добавить маппинг. Однако это нарушает семантику слоев и не рекомендуется.
    @Component // Не @Controller, но все равно бин
    @RequestMapping("/custom")
    public class UnconventionalController {
        @GetMapping("/test")
        public String test() {
            return "Works, but is not a good practice";
        }
    }

    Вывод: @Controller – это семантический маркер, но технически Spring обрабатывает запросы к любому бину, методы которого помечены аннотациями маппинга.