Ответ 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.