Что произойдет, если использовать @Component вместо @Repository в Spring?

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

Ответ

Класс будет корректно зарегистрирован как Spring-бин, но потеряются специфичные для репозитория преимущества.

Ключевые различия:

Аспект @Repository @Component
Семантика Явно указывает DAO/репозиторий Общая аннотация для любого компонента
Обработка исключений Автоматически перехватывает JDBC/JPA исключения → DataAccessException Нет автоматической трансформации
Поиск компонентов Легче находить через @Repository в коде Менее информативно

Пример:

// Работает, но не рекомендуется
@Component
public class UserRepositoryImpl {
    // При исключении JDBC получим raw exception
}

// Предпочтительный вариант
@Repository
public class UserRepositoryImpl {
    // Исключения автоматически преобразуются в DataAccessException
}

Практическое следствие:

  • Без @Repository придется вручную обрабатывать специфичные исключения БД
  • Код становится менее читаемым и нарушает соглашения Spring
  • Могут возникнуть проблемы с некоторыми инструментами (например, Spring Data JPA)