Подтвердить что ты не робот

Понимание интерфейса <JPY @NoRepositoryBean Spring

Я встречался с интерфейсом @NoRepositoryBean несколько раз, читая документацию Spring Data.

Чтобы привести цитату из документации:

Если вы используете автоматическое определение интерфейса репозитория, используя Spring пространство имен с использованием интерфейса так же, как и будет, вызывает Springпытаясь создать экземпляр MyRepository. Это, конечно, не желательно, поскольку он просто действует как промежуточный между Репозиторием и интерфейсы реального репозитория, которые вы хотите определить для каждого объекта. к исключить, что интерфейс, расширяющий репозиторий, создается экземпляр репозитория аннотирует его с помощью @NoRepositoryBean.

Однако я все еще не уверен, когда и где его использовать. Может ли кто-нибудь проконсультироваться и дать мне конкретный пример использования?

4b9b3361

Ответ 1

Аннотации используются, чтобы избежать создания прокси-серверов репозитория для интерфейсов, которые фактически соответствуют критериям интерфейса репо, но не предназначены для того, чтобы быть одним. Это необходимо только после того, как вы начнете использовать все хранилища с функциональностью. Позвольте мне привести вам пример:

Предположим, вы хотите добавить метод foo() во все ваши репозитории. Вы должны начать с добавления интерфейса репо, подобного этому

public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> {

  void foo();
}

Вы также добавили бы соответствующий класс реализации, factory и так далее. Конкретные интерфейсы репозитория теперь расширят этот промежуточный интерфейс:

public interface com.foobar.CustomerRepository extends MyBaseInterface<Customer, Long> {

}

Теперь предположим, что вы загрузите - скажем Spring Data JPA - следующим образом:

<jpa:repositories base-package="com.foobar" />

Вы используете com.foobar, потому что у вас есть CustomerRepository в том же пакете. Инфраструктура данных Spring теперь не имеет возможности сказать, что MyBaseRepository не является конкретным интерфейсом репозитория, а скорее выступает в качестве промежуточного репо, чтобы разоблачить дополнительный метод. Поэтому он попытается создать для него экземпляр прокси-сервера репозитория и потерпеть неудачу. Теперь вы можете использовать @NoRepositoryBean для комментирования этого промежуточного интерфейса, чтобы по существу сообщить Spring Данные: не создавайте прокси-сервер репозитория bean для этого интерфейса.

Этот сценарий также является причиной того, что CrudRepository и PagingAndSortingRepository несут эту аннотацию. Если сканирование пакетов будет автоматически удалять их (потому что вы случайно сконфигурировали его таким образом), bootstrap завершится с ошибкой.

Короче говоря: используйте аннотацию, чтобы предотвратить перехват интерфейсов репозитория в качестве кандидатов, чтобы в конечном итоге стать экземплярами репозитория bean.