Что делает аннотация @Component в Spring?

«Что делает аннотация @Component в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Аннотация @Component — это стереотипная аннотация, которая помечает класс как кандидата для автоматического обнаружения и регистрации в контексте Spring как бина (bean).

Что происходит при сканировании:

  1. Spring (через @ComponentScan) сканирует указанные пакеты.
  2. Классы, помеченные @Component (или ее специализациями: @Service, @Repository, @Controller), обнаруживаются.
  3. Для каждого такого класса Spring создает определение бина (BeanDefinition) и регистрирует его в ApplicationContext.
  4. По умолчанию создается один экземпляр (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 — веб-слой.