simplejparepository query mkyong jparepository example data custom java spring jpa spring-data spring-data-jpa

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?