2012-07-20 1 views
23

Ich habe die Schnittstelle @NoRepositoryBean mehrmals beim Lesen der Spring Data-Dokumentation gefunden.Die Spring-Daten verstehen JPA @NoRepositoryBean-Schnittstelle

aus der Dokumentation zitieren:

Wenn Sie die automatische Repository-Schnittstelle Erkennung mit Hilfe des Spring-Namespace verwenden, wie die Schnittstelle mit nur bewirkt, dass Frühling ist versuchen, eine Instanz von MyRepository zu erstellen. Dies ist natürlich nicht gewünscht, da es nur als Zwischenspeicher zwischen Repository und tatsächlichen Repository-Schnittstellen fungiert, die Sie für jede Entität definieren möchten. Zu schließen Sie aus, dass eine Schnittstelle, die das Repository erweitert, instanziiert wird, als Repository-Instanz es mit @NoRepositoryBean annotieren.

Ich bin jedoch immer noch nicht sicher wann und wo ich es verwenden soll. Kann mir jemand bitte ein konkretes Anwendungsbeispiel geben und mir geben?

Antwort

77

Die Annotation wird verwendet, um die Erstellung von Repository-Proxies für Schnittstellen zu vermeiden, die tatsächlich den Kriterien einer Repo-Schnittstelle entsprechen, aber nicht dazu gedacht sind. Es ist nur erforderlich, wenn Sie beginnen, alle Repositories mit Funktionen zu erweitern. Lassen Sie mich Ihnen ein Beispiel geben:

Angenommen, Sie möchten eine Methode foo() zu allen Ihren Repositories hinzufügen. Sie würden mit dem Hinzufügen einer Repo-Schnittstelle wie folgt beginnen

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

    void foo(); 
} 

Sie würden auch die entsprechende Implementierungsklasse, Fabrik und so weiter hinzufügen. Sie konkrete Repository-Schnittstellen würde erweitern nun diese Zwischen Schnittstelle:

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

} 

nun annehmen, dass Sie Bootstrap - sagen wir mal Spring Data JPA - wie folgt:

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

Sie com.foobar verwenden, da Sie CustomerRepository im gleichen Paket haben . Die Spring Data-Infrastruktur kann nun nicht feststellen, dass MyBaseRepository keine konkrete Repository-Schnittstelle ist, sondern als Zwischenrepo fungiert, um die zusätzliche Methode verfügbar zu machen. So würde es versuchen, eine Repository-Proxy-Instanz für sie zu erstellen und fehlschlagen. Sie können jetzt @NoRepositoryBean verwenden, um diese Zwischenschnittstelle mit Anmerkungen zu versehen, damit Spring Data im Wesentlichen informiert wird: Erstellen Sie keine Repository-Proxy-Bean für diese Schnittstelle.

Dieses Szenario ist auch der Grund, warum CrudRepository und PagingAndSortingRepository diese Annotation auch tragen. Wenn der Paket-Scan diese versehentlich auffängt (weil Sie es versehentlich so konfiguriert haben), würde der Bootstrap fehlschlagen.

Kurz gesagt: Verwenden Sie die Annotation, um zu verhindern, dass Repository-Schnittstellen als Kandidaten ausgewählt werden, um schließlich als Repository-Bean-Instanzen zu enden.

+3

Danke für diese detaillierte Erklärung Oliver. – balteo

+0

Super Antwort. Danke. – ozgur

+0

Schön erklärte Antwort. – Mukti

Verwandte Themen