Является ли класс, аннотированный @Controller, Spring-бином?

Ответ

Да, класс, помеченный аннотацией @Controller (или @RestController), является Spring-бином. Аннотация @Controller — это стереотипная аннотация, помеченная как @Component, поэтому она автоматически обнаруживается при сканировании компонентов и регистрируется в контексте приложения Spring IoC.

Почему это бин:

  • Управляется контейнером Spring (создание, внедрение зависимостей, lifecycle).
  • Может использовать @Autowired для инъекции зависимостей.
  • Может быть целью для Spring AOP (например, для @ExceptionHandler, @ModelAttribute).

Пример:

@Controller
@RequestMapping("/api")
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));
    }
}

Ответ 18+ 🔞

А, слушай, тут один умник на собеседовании такой вопрос подкинул, типа «а контроллер-то — это бин?». Я чуть со стула не упал, блядь. Ну, ёпта, конечно бин! Это ж основа основ, хуле тут думать-то?

Смотри, как оно работает, чтобы не быть, как тот чувак, который на лекции уснул. Аннотация @Controller — это, по сути, обёртка для @Component. А @Component — это как зелёный свет для Spring, мол «эй, контейнер, забери меня к себе, я твой!». Автоматическое сканирование компонентов его находит, и контейнер IoC его регистрирует, создаёт и жизненным циклом управляет. Всё, приехали, он теперь полноправный гражданин контекста.

Почему он бин, а не просто кусок кода? Да потому что:

  • Контейнер им рулит. Он его создаёт, зависимости ему внедряет (@Autowired), следит, чтобы не сдох раньше времени.
  • Зависимости инжектить можно. Сам просишь — «дай мне сервис», а Spring тебе его аккуратно в конструктор или поле суёт.
  • Под капотом AOP работает. Все эти @ExceptionHandler, @ModelAttribute — это всё прокси вокруг бина навешивается, магия Spring'а, блядь.

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

@Controller
@RequestMapping("/api")
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));
    }
}

Видишь? Класс помечен @Controller. Контейнер его видит, создаёт экземпляр, видит конструктор с @Autowired — и ебёшь мои костыли — тыкает туда готовый бин UserService. Всё, контроллер готов к работе, лови запросы. Если бы это был не бин, то кто бы ему сервис-то предоставил? Пришлось бы вручную создавать, а это уже каменный век, нахуй.

Так что да, контроллер — это стопроцентный, полноправный Spring-бин. Кто говорит иначе — тот, извини, просто еблан, который документацию не читал.