Можно ли применить аннотацию @Component к интерфейсу в Spring?

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

Ответ

Нет, это бессмысленно. Аннотации стереотипов (@Component, @Service, @Repository, @Controller) предназначены только для конкретных классов (Bean-классов).

Почему это не работает: Spring контейнер во время сканирования пути (@ComponentScan) ищет классы с этими аннотациями, создает их экземпляры (бины) и управляет их жизненным циклом. Интерфейс не может быть инстанциирован.

Правильный подход: Аннотация ставится на класс-реализацию.

// Интерфейс — это контракт (аннотации не нужны)
public interface PaymentService {
    void processPayment();
}

// Реализация — это бин, которым управляет Spring
@Service // Или @Component
public class DefaultPaymentService implements PaymentService {
    @Override
    public void processPayment() {
        // реализация
    }
}

Важно: Spring не выбросит ошибку, если вы пометите интерфейс @Component, но он просто проигнорирует эту аннотацию и не создаст бин.