tl;dr
Nej, av en mycket enkel anledning:det pågår ingen kodgenerering. Implementeringen baseras på proxyservrar och en metodinterceptor som delegerar samtalsexekveringen till rätt ställen.
Detaljer
Effektivt kan en metodexekvering backas upp av tre typer av kod:
-
Den butiksspecifika implementeringen av
CrudRepository
. Titta efter typer som heterSimple(Jpa|Mongo|Neo4|…)Repository
(se JPA-specifika här ). De har "riktiga" implementeringar för alla metoder iCrudRepository
ochPagingAndSortingRepository
. -
Frågemetoder exekveras effektivt av
QueryExecutorMethodInterceptor.doInvoke(…)
(se här ). Det är i grunden en 3-stegsprocess för att hitta delegeringsmålet och anropa det. Själva exekveringen görs i klasser som heter(Jpa|Mongo|Neo4j…)QueryExecution
(se den här till exempel). -
Anpassad implementeringskod anropas direkt, också från
QueryExecutorMethodInterceptor
.
Det enda som återstår är frågehärledningen, som består av två huvuddelar:metodnamnsanalys och frågeskapande. För det förstnämnda, ta en titt på PartTree
. Det kräver ett metodnamn och en bastyp och kommer att returnera dig en tolkad AST-liknande struktur eller skapa ett undantag om det inte lyckas lösa egenskaper eller liknande.
Det senare är implementerat i klasser som heter PartTree(Jpa|Mongo|Neo4j|…)Query
och delegerar till ytterligare komponenter för att faktiskt skapa den butiksspecifika frågan. T.ex. för JPA finns de intressanta bitarna förmodligen i JpaQueryCreator.PredicateBuilder.build()
(se här
).