В чем разница между аннотациями @Service и @Repository в Spring
Что проверяют
Знаете ли вы, что одна из этих аннотаций делает нечто конкретное, а не просто помечает слой. Ответ «обе создают бин» неполный.
Как отвечать
Обе это специализации @Component, и обе действительно превращают класс в бин при сканировании пакетов. Разница в двух вещах.
Первое, смысловое: @Service помечает слой бизнес-логики, @Repository слой доступа к данным. Это документирование архитектуры прямо в коде, и по нему же удобно писать правила проверки зависимостей между слоями.
Второе, техническое, и это то, что хотят услышать: @Repository включает перевод исключений. Spring оборачивает класс постобработчиком, который ловит специфичные для конкретной технологии исключения (SQLException, исключения JPA и Hibernate) и переводит их в общую иерархию DataAccessException. Благодаря этому сервисный код не зависит от того, какая технология доступа к данным используется под ним, и не ловит SQLException напрямую.
@Repository
public class JdbcOrderDao {
// нарушение уникальности прилетит наверх как DuplicateKeyException,
// а не как SQLException с кодом драйвера
}Полезно добавить: у интерфейсов Spring Data аннотация не нужна вовсе, реализация создаётся фреймворком и перевод исключений там уже включён. И что @Component, @Service, @Repository, @Controller для контейнера равнозначны с точки зрения создания бина, поэтому подмена одной на другую ничего не сломает, кроме перевода исключений и читаемости.
Где спотыкаются
Говорят, что разница чисто в названии.
Ставят @Repository на сервис ради красоты и получают неожиданное оборачивание исключений.
Не знают, что перевод исключений работает через постобработчик и требует, чтобы бин создавался контейнером, а не через new.