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
CrudRepositoryspecifická 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 vCrudRepositoryaPagingAndSortingRepository. -
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
).