2012-07-20 25 views
23

Me encontré con la interfaz @NoRepositoryBean varias veces mientras leía la documentación de Spring Data.Comprensión de Spring Data JPA @NoRepositoryBean interfaz

citar de la documentación:

Si está usando la detección automática de interfaz repositorio utilizando el espacio de nombres primavera usando la interfaz es tan causará primavera tratando de crear una instancia de MyRepository. Por supuesto, esto no es deseado, ya que solo actúa como intermediario intermedio entre el repositorio y las interfaces de repositorio reales que desea definir para cada entidad. Para excluir una interfaz que extienda Repositorio de instanciarse como instancia de repositorio anotarlo 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?

Respuesta

77

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.

+3

Gracias por esta explicación detallada Oliver. – balteo

+0

Súper respuesta. Gracias. – ozgur

+0

Respuesta bien explicada. – Mukti

Cuestiones relacionadas