Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: component, scan, interface

Можно ли повесить @Component на интерфейс и почему это не делает его бином?

Вопрос проверяет понимание того, как Spring создаёт бины и что именно контейнер считает кандидатом на инстанцирование.

Короткий ответ

Аннотацию @Component можно повесить на интерфейс, но это не сделает его бином. Spring регистрирует бины как конкретные экземпляры классов, а интерфейс нельзя инстанцировать. Контейнеру нужен класс с конструктором, чтобы создать объект. Поэтому @Component на интерфейсе не приводит к появлению бина в контексте.

Длинный ответ

Чтобы понять причину, важно вспомнить, что такое бин для Spring.

Определение

Бин Spring — это конкретный объект, экземпляр класса, созданный контейнером и управляемый им.

Почему интерфейс не становится бином

Интерфейс — это только контракт, а не реализация.

  1. Нельзя создать экземпляр

    • У интерфейса нет конструктора

    • new Interface() невозможен

  2. Component scanning

    • Spring находит аннотированный тип

    • Но не может создать BeanDefinition с инстанцированием

  3. Отсутствие реализации

    • Контейнер не знает, какой класс использовать

Когда интерфейсы всё-таки участвуют в DI

Хотя интерфейс не может быть бином, он активно используется в других ролях.

  1. Тип зависимости

    • Инжектится интерфейс

    • Реализация выбирается контейнером

  2. Прокси и AOP

    • Spring может создавать прокси на основе интерфейса

    • Но бин всё равно — конкретная реализация

  3. Специальные случаи

    • @FeignClient

    • @Repository с proxy-механизмами
      Здесь бин создаётся не напрямую из интерфейса, а через фабрики.

Пример правильного использования

public interface PaymentService {
    void pay();
}

@Component
class CardPaymentService implements PaymentService {
    public void pay() {}
}

Вывод

@Component на интерфейсе не создаёт бин, потому что Spring работает с экземплярами классов. Интерфейсы используются как контракты, а не как объекты.

Уровень

  • Рейтинг:

    4

  • Сложность:

    5

Навыки

  • Spring

    Spring

Ключевые слова

#component

#scan

#interface

Подпишись на Java Developer в телеграм