Вопрос проверяет понимание того, как Spring создаёт бины и что именно контейнер считает кандидатом на инстанцирование.
Аннотацию @Component можно повесить на интерфейс, но это не сделает его бином. Spring регистрирует бины как конкретные экземпляры классов, а интерфейс нельзя инстанцировать. Контейнеру нужен класс с конструктором, чтобы создать объект. Поэтому @Component на интерфейсе не приводит к появлению бина в контексте.
Чтобы понять причину, важно вспомнить, что такое бин для Spring.
Бин Spring — это конкретный объект, экземпляр класса, созданный контейнером и управляемый им.
Интерфейс — это только контракт, а не реализация.
Нельзя создать экземпляр
У интерфейса нет конструктора
new Interface() невозможен
Component scanning
Spring находит аннотированный тип
Но не может создать BeanDefinition с инстанцированием
Отсутствие реализации
Контейнер не знает, какой класс использовать
Хотя интерфейс не может быть бином, он активно используется в других ролях.
Тип зависимости
Инжектится интерфейс
Реализация выбирается контейнером
Прокси и AOP
Spring может создавать прокси на основе интерфейса
Но бин всё равно — конкретная реализация
Специальные случаи
@FeignClient
@Repository с proxy-механизмами
Здесь бин создаётся не напрямую из интерфейса, а через фабрики.
public interface PaymentService {
void pay();
}
@Component
class CardPaymentService implements PaymentService {
public void pay() {}
}
@Component на интерфейсе не создаёт бин, потому что Spring работает с экземплярами классов. Интерфейсы используются как контракты, а не как объекты.