MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Wie kann die von Spring Data MongoDB generierte Repository-Implementierung angezeigt werden?

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:

  1. Die geschäftsspezifische Implementierung von CrudRepository . Suchen Sie nach Typen namens Simple(Jpa|Mongo|Neo4|…)Repository (siehe JPA-spezifisch hier ). Sie haben "echte" Implementierungen für alle Methoden in CrudRepository und PagingAndSortingRepository .

  2. 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).

  3. 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 ).