tl;dr
Ne, z velmi jednoduchého důvodu:neprobíhá žádné generování kódu. Implementace je založena na proxy a metodovém zachycovači, který deleguje provádění hovorů na správná místa.
Podrobnosti
Spuštění metody může být efektivně podpořeno 3 typy kódu:
-
Implementace
CrudRepository
specifická pro obchod . Podívejte se na typy s názvemSimple(Jpa|Mongo|Neo4|…)Repository
(viz konkrétní JPA zde ). Mají "skutečné" implementace pro všechny metody vCrudRepository
aPagingAndSortingRepository
. -
Metody dotazů efektivně spouští
QueryExecutorMethodInterceptor.doInvoke(…)
(viz zde ). Je to v podstatě 3-krokový proces k nalezení cíle delegování a jeho vyvolání. Vlastní spuštění se provádí ve třídách s názvem(Jpa|Mongo|Neo4j…)QueryExecution
(viz například tento). -
Vlastní implementační kód je volán přímo, také z
QueryExecutorMethodInterceptor
.
Zbývá pouze odvození dotazu, které se skládá ze dvou hlavních částí:parsování názvu metody a vytvoření dotazu. V prvním případě se podívejte na PartTree
. Vyžaduje název metody a základní typ a vrátí vám analyzovanou strukturu podobnou AST nebo vyvolá výjimku, pokud selže při vyřešení vlastností nebo podobně.
Ten je implementován ve třídách s názvem PartTree(Jpa|Mongo|Neo4j|…)Query
a deleguje na další komponenty pro skutečné vytvoření dotazu specifického pro obchod. Např. pro JPA jsou zajímavé kousky pravděpodobně v JpaQueryCreator.PredicateBuilder.build()
(viz zde
).