java - query - Comprender la interfaz Spring Data JPA @ NoRepositoryBean
spring data jpa example mkyong (1)
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 que no pretenden ser una. Solo se requiere una vez que comiences a extender todos los repositorios con funcionalidad. Dejame darte un ejemplo:
Supongamos que desea agregar un método foo () a todos sus repositorios. Comenzarías por agregar una interfaz repo como esta
public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> {
void foo();
}
También agregaría la clase de implementación correspondiente, fábrica, etc. Sus interfaces de repositorio concretas ahora extenderían esa interfaz intermedia:
public interface com.foobar.CustomerRepository extends MyBaseInterface<Customer, Long> {
}
Ahora suponga que arranca, digamos Spring Data JPA, de la siguiente manera:
<jpa:repositories base-package="com.foobar" />
Utiliza com.foobar
porque tiene CustomerRepository
en el mismo paquete. La infraestructura de Spring Data ahora no tiene forma de decir que MyBaseRepository
no es una interfaz de depósito concreta, 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 hacer una anotación en esta interfaz intermedia que básicamente le @NoRepositoryBean
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.
Para resumir: utilice la anotación para evitar que las interfaces del repositorio se seleccionen como candidatos para que finalmente terminen como instancias de beans de repositorio.
Encontré la interfaz @NoRepositoryBean
varias veces mientras leía la documentación de Spring Data.
Para citar de la documentación:
Si usa la detección automática de la interfaz del repositorio utilizando el espacio de nombres de Spring utilizando la interfaz, tal como lo hará, Spring intentará crear una instancia de MyRepository. Por supuesto, esto no es deseable, ya que simplemente actúa como intermediario entre el repositorio y las interfaces de repositorio reales que desea definir para cada entidad. Para excluir una interfaz que extienda Repositorio desde la
@NoRepositoryBean
instancias como instancia de repositorio,@NoRepositoryBean
con@NoRepositoryBean
.
Sin embargo, todavía no estoy seguro de cuándo y dónde usarlo. ¿Puede alguien por favor asesorarme y darme un ejemplo de uso concreto?