Чем @Repository отличается от @Component помимо семантики?
- Зачем нужна аннотация @Repository?
@Repository включает трансляцию исключений: SQLException и исключения JPA превращаются в единую иерархию DataAccessException (DuplicateKeyException, DataIntegrityViolationException и др.).
- Работает через PersistenceExceptionTranslationPostProcessor и прокси
- Код сервиса не зависит от конкретной технологии доступа
- Репозитории Spring Data транслируют исключения сами
А ещё Семантически — маркер слоя доступа к данным
Подробно
Все стереотипы — это @Component с уточнённым смыслом, и для @Service и @Controller разница действительно только семантическая плюс возможность точечно нацелить аспект. Но @Repository несёт реальное поведение: PersistenceExceptionTranslationPostProcessor заворачивает такой бин в прокси и переводит SQLException, JPA-исключения и прочую технологическую специфику в неконтролируемые DataAccessException. Смысл в том, что сервисный слой перестаёт зависеть от способа доступа к данным. Транзакции при этом не появляются — их даёт только @Transactional.
Что хотят услышать
- Трансляция исключений и иерархия DataAccessException.
- Как она реализована.
Частые ошибки
- Думать, что @Repository открывает транзакцию.
- Считать все стереотипы полностью взаимозаменяемыми.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✓Трансляция исключений доступа к данным в DataAccessException
- ✗Автоматически оборачивает все методы класса в транзакцию на запись
- ✗Создаёт бин со scope prototype вместо singleton
- ✗Различий нет — это просто разные названия одного и того же
Что спросят дальше
- Зачем DataAccessException сделаны unchecked?
- Как стереотипы используются для точечной настройки аспектов?
Разбор темы
- Стереотипы, @Bean и автосвязывание
Стереотипные аннотации и их семантика, @Bean против @Component, component-scan, @Autowired и разрешение неоднозначности.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.