Wie Spring Data repositories tatsächlich umgesetzt?
Habe ich die Arbeit mit Spring Data JPA-repository in mein Projekt seit einiger Zeit und ich weiß, dass die unten Punkte:
- In der repository-interfaces, können wir die Methoden, wie
findByCustomerNameAndPhone()
(vorausgesetztcustomerName
undphone
sind Felder in der Domäne-Objekt). - Dann, die Feder stellt die Umsetzung durch die Umsetzung der oben genannten repository interface-Methoden zur Laufzeit (während der Applikation).
Ich bin interessiert, wie dieser codiert wurde und ich habe mir die Spring JPA source code & APIs, aber ich konnte nicht finden Sie Antworten auf die folgenden Fragen:
- Wie ist die repository-Implementierung der Klasse zur Laufzeit erzeugt & Methoden umgesetzt und eingeführt?
- Nicht Spring Data JPA verwenden CGlib oder jede bytecode-manipulation-Bibliotheken zur Implementierung der Methoden und injizieren dynamisch?
Könnten Sie bitte helfen mit den oben genannten Fragen und bieten auch Sie alle unterstützten Dokumentation ?
InformationsquelleAutor developer | 2016-07-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zuerst von allen, gibt es keine code-Generierung Los ist, das bedeutet: keine CGLib, keine byte-code-Generierung an alle. Der grundlegende Ansatz ist, dass ein JDK proxy-Instanz erstellt wird programmgesteuert mithilfe von Spring
ProxyFactory
- API zurück, die Schnittstelle und einMethodInterceptor
fängt alle Aufrufe auf die Instanz, und leitet die Verfahren in den entsprechenden stellen:DefaultRepositoryInformation
, wie diese bestimmt wird), ist das speichern bestimmter query-execution-Mechanismus aktiv wird, und die Abfrage ausgeführt wird, bestimmt ausgeführt werden, dass die Methode beim starten. Für die, die eine Auflösung Mechanismus, der versucht zu identifizieren, explizit deklariert Abfragen in verschiedenen Orten (mit@Query
auf die Methode, JPA named queries), schließlich fallen zurück zur Abfrage Ableitung aus dem Namen der Methode angegeben. Für das Abfrage-Mechanismus Erkennung findenJpaQueryLookupStrategy
. Die Analyse-Logik für die Abfrage Ableitung gefunden werden kann, inPartTree
. Die store-spezifische übersetzung in eine tatsächliche Abfrage, die gesehen werden kann, z.B. inJpaQueryCreator
.SimpleJpaRepository
bei JPA) und der Anruf wird weitergeleitet in eine Instanz.Die interceptor-Methode zum implementieren der routing-Logik ist
QueryExecutorMethodInterceptor
, der high-level-routing-Logik kann gefunden werden hier.Die Erstellung dieser Proxys ist gekapselt in einem standard-Java-basierten Fabrik-Muster-Umsetzung. Die high-level-proxy-Erstellung finden Sie in
RepositoryFactorySupport
. Die Shop-spezifische Implementierungen fügen Sie dann die notwendigen Infrastruktur-Komponenten, so dass für JPA Sie können gehen Sie vor und schreiben Sie einfach einen code wie diesen:Der Grund, warum ich erwähnen, dass explizit ist, dass es sollte klar werden, dass, im Kern, nichts, der code erfordert ein Frühling-container führen Sie in den ersten Platz. Es muss Frühling als Bibliothek in den Klassenpfad (weil wir lieber nicht das Rad neu erfinden), sondern container-Agnostiker im Allgemeinen.
Zur Erleichterung der integration mit DI-Containern haben wir natürlich dann gebaut, die integration mit Spring Java-Konfiguration, XML-namespace, aber auch ein CDI-Erweiterung, so dass die Feder-Daten können verwendet werden, im Klartext CDI Szenarien.
@Repository
kommentierte Schnittstellen in den ersten Platz? Blick aufRepositoryFactorySupport#getRepository()
zeigen Sie, dass der interface-Klasse als parameter, so muss es sein entdeckt anderswo. Ich bin vor allem versucht herauszufinden, wie zu finden, eine kommentierte Schnittstelle und generiert automatisch das JDK-proxy-bean, die die Schnittstelle implementiert, sehr viel wie der Frühling-Daten, aber für eine Anwendung bestimmte Zwecke, die nicht im Zusammenhang Repositories.Möchten Sie vielleicht einen Blick auf
RepositoryComponentProvider
. Es gibt keine automatischen Dinge passiert, aber ein scan-Komponente für bestimmte Arten (entweder kommentiert oder mit Anmerkungen) und eineFactoryBean
konfiguriert für jeden von denen.Sorry, Kommentar zu einem alten thread, war aber neugierig ... Sind die repository-proxies singleton-Objekte? Wir sehen ein problem, dass unser code ist zu versuchen, rufen Sie ein repo-Methode, aber es scheint nie in der Lage sein, um den Anruf auf dem proxy. Es hängt nur. Ich Frage mich, ob es darauf wartet, dass ein singleton, dass viel Los ist.
InformationsquelleAutor Oliver Drotbohm