tl;dr
Nein, aus einem ganz einfachen Grund:Es findet keine Codegenerierung statt. Die Implementierung basiert auf Proxys und einem Methoden-Interceptor, der die Aufrufausführungen an die richtigen Stellen delegiert.
Einzelheiten
Effektiv kann eine Methodenausführung durch 3 Arten von Code unterstützt werden:
-
Die geschäftsspezifische Implementierung von
CrudRepository
. Suchen Sie nach Typen namensSimple(Jpa|Mongo|Neo4|…)Repository
(siehe JPA-spezifisch hier ). Sie haben "echte" Implementierungen für alle Methoden inCrudRepository
undPagingAndSortingRepository
. -
Abfragemethoden werden effektiv von
QueryExecutorMethodInterceptor.doInvoke(…)
ausgeführt (siehe hier ). Es ist im Grunde ein dreistufiger Prozess, um das Delegierungsziel zu finden und aufzurufen. Die eigentliche Ausführung erfolgt in Klassen namens(Jpa|Mongo|Neo4j…)QueryExecution
(siehe zum Beispiel dieses hier). -
Benutzerdefinierter Implementierungscode wird direkt aufgerufen, auch von
QueryExecutorMethodInterceptor
.
Das Einzige, was übrig bleibt, ist die Abfrageableitung, die aus zwei Hauptteilen besteht:dem Analysieren von Methodennamen und der Abfrageerstellung. Für Ersteres werfen Sie einen Blick auf PartTree
. Es nimmt einen Methodennamen und einen Basistyp und gibt Ihnen eine geparste AST-ähnliche Struktur zurück oder löst eine Ausnahme aus, wenn Eigenschaften oder ähnliches nicht aufgelöst werden können.
Letzteres ist in Klassen namens PartTree(Jpa|Mongo|Neo4j|…)Query
implementiert und delegiert an zusätzliche Komponenten, um tatsächlich die geschäftsspezifische Abfrage zu erstellen. Z.B. für JPA sind die interessanten Bits wahrscheinlich in JpaQueryCreator.PredicateBuilder.build()
(siehe hier
).