Когда использовать аннотацию Spring в @Repository? - PullRequest
1 голос
/ 17 апреля 2019

Читая о создании пользовательских запросов в Spring , я заметил, что ни один из классов (UserRepositoryCustom, UserRepositoryCustomImpl, UserRepository) не использует аннотацию @Repository.

Я был удивлен этим, потому что обычно все классы приложений Spring аннотированы чем-то, что их обнаруживает, и для них создается прокси.Вот как работает аспектно-ориентированная среда в Java.

Затем я проверил свой старый рабочий код и понял, что мой интерфейс репозитория также не использует аннотацию.Тем не менее, это @Autowired как зависимость от контроллеров и других классов, которые его используют.Пример:

// AddressRepository.java
public interface AddressRepository extends CrudRepository<Address, String> {
}

// Repositories.java
@Getter // lombok
@Component
public class Repositories { // autowire this to have access to all repo's
    private final AddressRepository addressRepository;

    @Autowired
    public Repositories(AddressRepository addressRepository) {
        this.addressRepository = addressRepository;
    }
}

Возникают вопросы: Когда следует использовать аннотацию? и Почему неаннотированный класс автоматически обнаруживается при сканировании компонентов Spring?

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Он активирует преобразование исключений персистентности для всех bean-компонентов, аннотированных @Repository, чтобы исключения, генерируемые поставщиками персистентности JPA, были преобразованы в иерархию SpringAAException.

Это означает, что все непроверенные исключения, сгенерированные в этом классе, будут преобразованы в DataAccessException.

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.create-instances

0 голосов
/ 17 апреля 2019

Расширяющийся интерфейс org.springframework.data.repository.Repository отмечает подклассы для создания компонента.
В вашем случае наследование выглядит следующим образом:
YourRepository -> JpaRepository -> PagingAndSortingRepository -> CrudRepository ->org.springframework.data.repository.Repository
Согласно документации:
General purpose is to hold type information as well as being able to discover interfaces that extend this one during classpath scanning for easy Spring bean creation.
Источник: Хранилище интерфейсов

...