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:
-
L'implementazione specifica del negozio di
CrudRepository
. Dai un'occhiata ai tipi chiamatiSimple(Jpa|Mongo|Neo4|…)Repository
(vedi quello specifico JPA qui ). Hanno implementazioni "reali" per tutti i metodi inCrudRepository
ePagingAndSortingRepository
. -
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). -
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
).