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