tl;dr
Nej, af en meget simpel grund:der er ingen kodegenerering i gang. Implementeringen er baseret på proxyer og en metodeinterceptor, der uddelegerer opkaldsudførelserne til de rigtige steder.
Detaljer
Effektivt kan en metodeudførelse understøttes af 3 typer kode:
-
Den butiksspecifikke implementering af
CrudRepository
. Se efter typer med navnetSimple(Jpa|Mongo|Neo4|…)Repository
(se den JPA-specifikke her ). De har "rigtige" implementeringer for alle metoderne iCrudRepository
ogPagingAndSortingRepository
. -
Forespørgselsmetoder udføres effektivt af
QueryExecutorMethodInterceptor.doInvoke(…)
(se her ). Det er dybest set en 3-trins-proces at finde delegationsmålet og påberåbe det. Den faktiske udførelse udføres i klasser med navnet(Jpa|Mongo|Neo4j…)QueryExecution
(se f.eks. denne). -
Tilpasset implementeringskode kaldes direkte, også fra
QueryExecutorMethodInterceptor
.
Det eneste, der er tilbage, er forespørgselsafledningen, som består af to hoveddele:analyse af metodenavn og oprettelse af forespørgsler. For førstnævnte, tag et kig på PartTree
. Det kræver et metodenavn og en basistype og vil returnere dig en parset AST-lignende struktur eller kaste en undtagelse, hvis det ikke lykkes med at løse egenskaber eller lignende.
Sidstnævnte er implementeret i klasser med navnet PartTree(Jpa|Mongo|Neo4j|…)Query
og delegerede til yderligere komponenter for faktisk at oprette den butiksspecifikke forespørgsel. For eksempel. for JPA er de interessante bits sandsynligvis i JpaQueryCreator.PredicateBuilder.build()
(se her
).