tl;dr
Nee, om een heel eenvoudige reden:er wordt geen code gegenereerd. De implementatie is gebaseerd op proxy's en een methode-interceptor die de oproepuitvoeringen naar de juiste plaatsen delegeert.
Details
In feite kan de uitvoering van een methode worden ondersteund door 3 soorten code:
-
De winkelspecifieke implementatie van
CrudRepository
. Zoek naar typen met de naamSimple(Jpa|Mongo|Neo4|…)Repository
(zie de specifieke JPA hier ). Ze hebben "echte" implementaties voor alle methoden inCrudRepository
enPagingAndSortingRepository
. -
Query-methoden worden effectief uitgevoerd door
QueryExecutorMethodInterceptor.doInvoke(…)
(zie hier ). Het is in feite een proces van drie stappen om het delegatiedoel te vinden en aan te roepen. De daadwerkelijke uitvoering wordt gedaan in klassen met de naam(Jpa|Mongo|Neo4j…)QueryExecution
(zie deze bijvoorbeeld). -
Aangepaste implementatiecode wordt rechtstreeks aangeroepen, ook vanuit
QueryExecutorMethodInterceptor
.
Het enige dat overblijft is de afleiding van de query, die uit twee hoofdonderdelen bestaat:het ontleden van de methodenaam en het maken van de query. Kijk voor de eerste eens op PartTree
. Het heeft een methodenaam en een basistype nodig en geeft een geparseerde AST-achtige structuur terug of genereert een uitzondering als het niet lukt om eigenschappen of iets dergelijks op te lossen.
Dit laatste wordt geïmplementeerd in klassen met de naam PartTree(Jpa|Mongo|Neo4j|…)Query
en delegeert naar aanvullende componenten voor het daadwerkelijk maken van de winkelspecifieke query. bijv. voor JPA staan de interessante bits waarschijnlijk in JpaQueryCreator.PredicateBuilder.build()
(zie hier
).