Ответ
Аннотация @Component — это стереотипная аннотация, которая помечает класс как кандидата для автоматического обнаружения и регистрации в контексте Spring как бина (bean).
Что происходит при сканировании:
- Spring (через
@ComponentScan) сканирует указанные пакеты. - Классы, помеченные
@Component(или ее специализациями:@Service,@Repository,@Controller), обнаруживаются. - Для каждого такого класса Spring создает определение бина (
BeanDefinition) и регистрирует его вApplicationContext. - По умолчанию создается один экземпляр (singleton) этого бина, которым Spring управляет на протяжении жизненного цикла приложения.
Пример:
// 1. Помечаем класс
@Component // Имя бина по умолчанию: "notificationService"
public class NotificationService {
public void send(String message) {
System.out.println("Sending: " + message);
}
}
// 2. Используем в другом компоненте
@Component
public class OrderProcessor {
// Spring автоматически внедрит (inject) бин NotificationService
@Autowired
private NotificationService notifier;
public void processOrder() {
notifier.send("Order processed!");
}
}
Ключевые аспекты:
- Имя бина: По умолчанию — имя класса с маленькой буквы (notificationService). Можно задать явно:
@Component("myNotifier"). - Область видимости (Scope): По умолчанию
singleton. Можно изменить, например,@Scope("prototype"). - Необходимость
@ComponentScan: Без включенного сканирования (в конфигурации с@Configurationили в Spring Boot приложении) классы с@Componentне будут обнаружены. - Специализации: Используйте более конкретные аннотации для лучшей семантики и дополнительной функциональности:
@Service— бизнес-логика.@Repository— доступ к данным (добавляет трансляцию исключений вDataAccessException).@Controller/@RestController— веб-слой.