Ответ
Класс будет корректно зарегистрирован как 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)