Является ли контроллер в Spring бином?

Ответ

Да, контроллер в Spring является бином. Классы, помеченные аннотациями @Controller или @RestController, являются специализированными стереотипными аннотациями, производными от @Component. Spring IoC-контейнер автоматически обнаруживает и регистрирует их как бины в контексте приложения во время сканирования компонентов.

Почему это важно:

  • Бин-контроллер управляется контейнером Spring (инверсия управления).
  • Внедрение зависимостей (@Autowired) в контроллер работает, так как он является бином.
  • Доступны все возможности Spring AOP (аспекты, транзакции и т.д.).

Пример:

@RestController // Специализация @Component для веб-слоя
public class UserController {
    private final UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping("/users/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.findById(id));
    }
}

Класс UserController будет зарегистрирован как бин с именем "userController" (по соглашению об именовании).

Ответ 18+ 🔞

Да ты посмотри на эту дичь, блядь! Ну, конечно, контроллер в Spring — это же бин, ёпта! Что за вопрос вообще? Это как спросить: «А вода, она мокрая?» Сука, да!

Эти твои аннотации @Controller или @RestController — они же, блядь, прямые родственники @Component, просто в парике и с галстуком, для веб-слоя. Весной, когда контейнер просыпается и начинает своё сканирование, он на них смотрит и такой: «О, блядь, ещё один клиент! Записываем в реестр, хуле».

И вот почему это пиздец как важно, слушай сюда:

  • Этот контроллер — не сам себе хозяин, а марионетка в лапах Spring IoC, то есть полная инверсия управления, ебать мои старые костыли!
  • Хочешь засунуть в него какой-нибудь сервис через @Autowired? Да пожалуйста, хуй с горы! Работает, потому что он — полноценный бин, а не просто класс.
  • Хочешь обвешать его аспектами, транзакциями или ещё какой магией? Да на здоровье, вся мощь Spring AOP к твоим услугам, блядь!

Смотри, как это выглядит на практике, простой пример:

@RestController // Это типа продвинутый @Component для веба, понял?
public class UserController {
    private final UserService userService; // Зависимость, которую надо впендюрить

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService; // Вот, вмандорили её, красота!
    }

    @GetMapping("/users/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        return ResponseEntity.ok(userService.findById(id)); // Работает, потому что всё — бины!
    }
}

И этот UserController спокойно регистрируется в контексте как бин с именем «userController». Всё, пиздец, вопрос закрыт. Никакой мистики, одна прагматичная магия Spring, ядрёна вошь!