tl;dr
Non, pour une raison très simple :il n'y a pas de génération de code en cours. L'implémentation est basée sur des proxys et un intercepteur de méthode déléguant les exécutions d'appels aux bons endroits.
Détails
En effet, l'exécution d'une méthode peut s'appuyer sur 3 types de code :
-
L'implémentation spécifique au magasin de
CrudRepository
. Jetez un œil aux types nommésSimple(Jpa|Mongo|Neo4|…)Repository
(voir celui spécifique à JPA ici ). Ils ont des implémentations "réelles" pour toutes les méthodes dansCrudRepository
etPagingAndSortingRepository
. -
Les méthodes de requête sont effectivement exécutées par
QueryExecutorMethodInterceptor.doInvoke(…)
(voir ici ). Il s'agit essentiellement d'un processus en 3 étapes pour trouver la cible de délégation et l'invoquer. L'exécution proprement dite se fait dans des classes nommées(Jpa|Mongo|Neo4j…)QueryExecution
(voir celui-ci par exemple). -
Le code d'implémentation personnalisé est appelé directement, également depuis
QueryExecutorMethodInterceptor
.
La seule chose qui reste est la dérivation de la requête, qui se compose de deux parties principales :l'analyse du nom de la méthode et la création de la requête. Pour le premier, jetez un œil à PartTree
. Il prend un nom de méthode et un type de base et vous renverra une structure de type AST analysée ou lèvera une exception si elle ne parvient pas à résoudre les propriétés ou autres.
Ce dernier est implémenté dans des classes nommées PartTree(Jpa|Mongo|Neo4j|…)Query
et délègue à des composants supplémentaires pour créer réellement la requête spécifique au magasin. Par exemple. pour JPA, les bits intéressants sont probablement dans JpaQueryCreator.PredicateBuilder.build()
(voir ici
).