La anotación se usa para evitar la creación de proxies de repositorio para las interfaces que realmente coinciden con los criterios de una interfaz repo, pero no están destinadas a ser una. Solo se requiere una vez que comiences a extender todos los repositorios con funcionalidad. Déjame darte un ejemplo:
Asume que quieres agregar un método foo() a todos tus repositorios. Se podría empezar por la adición de una interfaz de recompra como esto
public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> {
void foo();
}
También debería añadir la clase de implementación de acuerdo, fábrica y así sucesivamente. Usted interfaces de repositorio de hormigón haría ahora extender esa interfaz intermedia:
public interface com.foobar.CustomerRepository extends MyBaseInterface<Customer, Long> {
}
Supongamos ahora que el bootstrap - digamos primavera de datos JPA - de la siguiente manera:
<jpa:repositories base-package="com.foobar" />
usted utilizar com.foobar
porque tiene CustomerRepository
en el mismo paquete . La infraestructura de Spring Data ahora no tiene manera de saber que MyBaseRepository
no es una interfaz de repositorio concreto, sino que actúa como repo intermedio para exponer el método adicional. Por lo tanto, intentará crear una instancia de proxy de repositorio para él y fallará. Ahora puede usar @NoRepositoryBean
para anotar esta interfaz intermedia para, básicamente, indicar a Spring Data: no cree un bean proxy de repositorio para esta interfaz.
Ese escenario es también la razón por la cual CrudRepository
y PagingAndSortingRepository
llevan esta anotación también. Si el escaneo del paquete los recogiera por accidente (porque lo has configurado accidentalmente de esta manera), el bootstrap fallaría.
Resumen largo: utilice la anotación para evitar que las interfaces del repositorio se seleccionen como candidatos para terminar finalmente como instancias de beans de repositorio.
Gracias por esta explicación detallada Oliver. – balteo
Súper respuesta. Gracias. – ozgur
Respuesta bien explicada. – Mukti