Ответ
@Repository — это стереотипная аннотация Spring, помечающая класс как компонент уровня доступа к данным (DAO). Её основная функция — автоматическое преобразование исключений JDBC/Hibernate в непроверяемые исключения Spring DataAccessException.
Когда аннотация обязательна при наследовании:
-
Кастомная реализация репозитория (класс). Если вы создаёте конкретный класс, реализующий интерфейс репозитория с собственной логикой доступа к данным (например, через
JdbcTemplate), аннотация@Repositoryнеобходима.- Зачем: Для регистрации бина в контексте Spring и активации перехвата исключений.
-
Пример:
@Repository // Обязательно! public class CustomUserRepositoryImpl implements UserRepositoryCustom { @Autowired private JdbcTemplate jdbcTemplate; @Override public User findWithComplexQuery(Long id) { // Кастомная JDBC-логика // Исключения будут автоматически преобразованы в DataAccessException } }
-
Когда аннотация НЕ обязательна:
- При наследовании интерфейса от
JpaRepository,CrudRepositoryи т.д. Spring Data JPA автоматически создаёт прокси-реализацию, и@Repositoryизбыточна (хотя может быть указана для ясности).// @Repository здесь не требуется public interface UserRepository extends JpaRepository<User, Long> { // Запросы, объявленные по методам или @Query }
- При наследовании интерфейса от
Итог: @Repository критически важна для ваших собственных классов-репозиториев, но не для интерфейсов Spring Data JPA.