2012-07-20 20 views
23

Ho incontrato l'interfaccia @NoRepositoryBean diverse volte durante la lettura della documentazione Spring Data.Comprensione dei dati di primavera Interfaccia JPA @NoRepositoryBean

di citare la documentazione:

Se si utilizza il rilevamento automatico interfaccia repository utilizzando lo spazio primavera utilizzando l'interfaccia proprio come è causerà primavera cercando di creare un'istanza di MyRepository. Questo ovviamente non è desiderato poiché agisce semplicemente come indermediato tra il repository e le interfacce del repository effettivo che si desidera definire per ciascuna entità. Per escludere un'interfaccia che estende il repository dall'istanza come istanza del repository annotarla con @NoRepositoryBean.

Tuttavia, non sono ancora sicuro di quando e dove utilizzarlo. Qualcuno può consigliarmi e darmi un esempio concreto di utilizzo?

risposta

77

L'annotazione viene utilizzata per evitare la creazione di proxy di repository per le interfacce che effettivamente corrispondono ai criteri di un'interfaccia di repository ma non sono intese per essere uno. È richiesto solo dopo aver iniziato ad estendere tutti i repository con funzionalità. Lasciatemi fare un esempio:

Si supponga di voler aggiungere un metodo foo() a tutti i repository. Si potrebbe iniziare con l'aggiunta di un'interfaccia di pronti contro termine come questo

public interface com.foobar.MyBaseInterface<…,…> extends CrudRepository<…,…> { 

    void foo(); 
} 

Si potrebbe anche aggiungere il secondo classe di implementazione, fabbrica e così via. È interfacce repository di cemento sarebbe ora estendere tale interfaccia intermedia:

public interface com.foobar.CustomerRepository extends MyBaseInterface<Customer, Long> { 

} 

Ora assumere il bootstrap - diciamo primavera dati JPA - come segue:

<jpa:repositories base-package="com.foobar" /> 

È utilizzare com.foobar perché avete CustomerRepository nello stesso pacchetto . L'infrastruttura Spring Data ora non ha modo di dire che lo MyBaseRepository non è un'interfaccia di repository concreta ma piuttosto funge da repo intermedio per esporre il metodo aggiuntivo. Così proverebbe a creare un'istanza proxy repository per esso e fallire. È ora possibile utilizzare @NoRepositoryBean per annotare questa interfaccia intermedia in modo da dire essenzialmente a Spring Data: non creare un bean proxy repository per questa interfaccia.

Questo scenario è anche il motivo per cui CrudRepository e PagingAndSortingRepository portano anche questa annotazione. Se la scansione del pacchetto li prelevasse per sbaglio (perché l'hai accidentalmente configurato in questo modo) il bootstrap fallirebbe.

Per farla breve: utilizzare l'annotazione per impedire che le interfacce del repository vengano prelevate come candidati per finire come istanze di bean di repository.

+3

Grazie per questa spiegazione dettagliata Oliver. – balteo

+0

Super risposta. Grazie. – ozgur

+0

Risposta ben spiegata. – Mukti

Problemi correlati