MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come vedere l'implementazione del repository generata da Spring Data MongoDB?

tl;dr

No, per un motivo molto semplice:non c'è generazione di codice in corso. L'implementazione si basa su proxy e un intercettore di metodi che delega le esecuzioni delle chiamate nei posti giusti.

Dettagli

In effetti, l'esecuzione di un metodo può essere supportata da 3 tipi di codice:

  1. L'implementazione specifica del negozio di CrudRepository . Dai un'occhiata ai tipi chiamati Simple(Jpa|Mongo|Neo4|…)Repository (vedi quello specifico JPA qui ). Hanno implementazioni "reali" per tutti i metodi in CrudRepository e PagingAndSortingRepository .

  2. I metodi di query vengono effettivamente eseguiti da QueryExecutorMethodInterceptor.doInvoke(…) (vedi qui ). È fondamentalmente un processo in 3 fasi per trovare la destinazione della delega e richiamarla. L'esecuzione effettiva viene eseguita in classi denominate (Jpa|Mongo|Neo4j…)QueryExecution (vedi questo per esempio).

  3. Il codice di implementazione personalizzato viene chiamato direttamente, anche da QueryExecutorMethodInterceptor .

L'unica cosa rimasta è la derivazione della query, che consiste in due parti principali:analisi del nome del metodo e creazione della query. Per il primo, dai un'occhiata a PartTree . Prende un nome di metodo e un tipo di base e ti restituirà una struttura simile ad AST analizzata o genererà un'eccezione se non riesce a risolvere proprietà o simili.

Quest'ultimo è implementato in classi denominate PartTree(Jpa|Mongo|Neo4j|…)Query e delega a componenti aggiuntivi per creare effettivamente la query specifica del negozio. Per esempio. per JPA i bit interessanti sono probabilmente in JpaQueryCreator.PredicateBuilder.build() (vedi qui ).