Когда использовать аннотацию Spring @Repository?

Читая о создании пользовательских запросов в 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?


person Snackoverflow    schedule 17.04.2019    source источник
comment
у вас есть пример?   -  person Markus G.    schedule 17.04.2019
comment
Ознакомьтесь с этим вопросом stackoverflow.com/questions/ 44069367/   -  person htshame    schedule 17.04.2019
comment
@htshame Спасибо, это отвечает на вторую половину моего вопроса.   -  person Snackoverflow    schedule 17.04.2019
comment
@МаркусГ. отредактировано, чтобы добавить пример   -  person Snackoverflow    schedule 17.04.2019


Ответы (3)


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

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

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

person RamiReddy P    schedule 17.04.2019
comment
Вывод: полезность этой аннотации заключается в том, что я могу обрабатывать все DataAccessException иначе, чем общий тип Throwable? - person Snackoverflow; 17.04.2019
comment
Да, проверьте logicbig .com/tutorials/spring-framework/ - person RamiReddy P; 17.04.2019

@Autowired запрашивает у Spring IoC-Container объект типа AddressRepository. Будучи интерфейсом, он не может быть создан, поэтому должна быть реализация.

org.springframework.data.jpa.repository.support.SimpleJpaRepository это реализация:

@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {

и здесь вы видите аннотацию @Repository, которая действует как специализация для @Component.

person SCRE    schedule 19.05.2020

Интерфейс расширения 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.
Источник: Репозиторий интерфейса

person balag3    schedule 17.04.2019
comment
Похоже, что в иерархии наследования CrudRepository или JpaRepository нет аннотации @Repository. - person Snackoverflow; 17.04.2019