Ответ
Да, контроллер в 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, ядрёна вошь!