Ответ
Да, класс, помеченный аннотацией @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-бин. Кто говорит иначе — тот, извини, просто еблан, который документацию не читал.