tl;dr
No, por una razón muy simple:no se está generando código. La implementación se basa en proxies y un interceptor de métodos que delega las ejecuciones de llamadas a los lugares correctos.
Detalles
Efectivamente, la ejecución de un método puede estar respaldada por 3 tipos de código:
-
La implementación específica de la tienda de
CrudRepository
. Busque tipos llamadosSimple(Jpa|Mongo|Neo4|…)Repository
(ver el específico de JPA aquí ). Tienen implementaciones "reales" para todos los métodos enCrudRepository
yPagingAndSortingRepository
. -
Los métodos de consulta son ejecutados efectivamente por
QueryExecutorMethodInterceptor.doInvoke(…)
(ver aquí ). Es básicamente un proceso de 3 pasos para encontrar el destino de la delegación e invocarlo. La ejecución real se realiza en clases denominadas(Jpa|Mongo|Neo4j…)QueryExecution
(ver este por ejemplo). -
El código de implementación personalizado se llama directamente, también desde
QueryExecutorMethodInterceptor
.
Lo único que queda es la derivación de la consulta, que consta de dos partes principales:el análisis del nombre del método y la creación de la consulta. Para lo primero, echa un vistazo a PartTree
. Toma un nombre de método y un tipo base y le devolverá una estructura similar a AST analizada o generará una excepción si no puede resolver las propiedades o similares.
Este último se implementa en clases llamadas PartTree(Jpa|Mongo|Neo4j|…)Query
y delega a componentes adicionales para crear realmente la consulta específica de la tienda. P.ej. para JPA, las partes interesantes probablemente estén en JpaQueryCreator.PredicateBuilder.build()
(ver aquí
).