MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Comment voir l'implémentation du référentiel généré par Spring Data MongoDB ?

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 :

  1. L'implémentation spécifique au magasin de CrudRepository . Jetez un œil aux types nommés Simple(Jpa|Mongo|Neo4|…)Repository (voir celui spécifique à JPA ici ). Ils ont des implémentations "réelles" pour toutes les méthodes dans CrudRepository et PagingAndSortingRepository .

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

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