В каких случаях аннотация @Repository обязательна при наследовании в Spring?

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

Ответ

@Repository — это стереотипная аннотация Spring, помечающая класс как компонент уровня доступа к данным (DAO). Её основная функция — автоматическое преобразование исключений JDBC/Hibernate в непроверяемые исключения Spring DataAccessException.

Когда аннотация обязательна при наследовании:

  1. Кастомная реализация репозитория (класс). Если вы создаёте конкретный класс, реализующий интерфейс репозитория с собственной логикой доступа к данным (например, через JdbcTemplate), аннотация @Repository необходима.

    • Зачем: Для регистрации бина в контексте Spring и активации перехвата исключений.
    • Пример:

      @Repository // Обязательно!
      public class CustomUserRepositoryImpl implements UserRepositoryCustom {
      @Autowired
      private JdbcTemplate jdbcTemplate;
      
      @Override
      public User findWithComplexQuery(Long id) {
          // Кастомная JDBC-логика
          // Исключения будут автоматически преобразованы в DataAccessException
      }
      }
  2. Когда аннотация НЕ обязательна:

    • При наследовании интерфейса от JpaRepository, CrudRepository и т.д. Spring Data JPA автоматически создаёт прокси-реализацию, и @Repository избыточна (хотя может быть указана для ясности).
      // @Repository здесь не требуется
      public interface UserRepository extends JpaRepository<User, Long> {
      // Запросы, объявленные по методам или @Query
      }

Итог: @Repository критически важна для ваших собственных классов-репозиториев, но не для интерфейсов Spring Data JPA.