tl;dr
Não, por uma razão muito simples:não há geração de código acontecendo. A implementação é baseada em proxies e um método interceptor que delega as execuções de chamadas para os lugares certos.
Detalhes
Efetivamente, a execução de um método pode ser apoiada por 3 tipos de código:
-
A implementação específica da loja deCrudRepository
. Dê uma olhada nos tipos chamadosSimple(Jpa|Mongo|Neo4|…)Repository
(consulte o específico da JPA aqui ). Eles têm implementações "reais" para todos os métodos emCrudRepository
ePagingAndSortingRepository
.
-
Os métodos de consulta são efetivamente executados porQueryExecutorMethodInterceptor.doInvoke(…)
(consulte aqui ). É basicamente um processo de 3 etapas para encontrar o destino da delegação e invocá-lo. A execução real é feita em classes chamadas(Jpa|Mongo|Neo4j…)QueryExecution
(veja este por exemplo).
-
O código de implementação personalizado é chamado diretamente, também deQueryExecutorMethodInterceptor
.
A única coisa que resta é a derivação da consulta, que consiste em duas partes principais:análise do nome do método e criação da consulta. Para o primeiro, dê uma olhada em
PartTree
. Ele recebe um nome de método e um tipo base e retornará uma estrutura semelhante a AST analisada ou lançará uma exceção se não conseguir resolver propriedades ou similares. O último é implementado em classes chamadas
PartTree(Jpa|Mongo|Neo4j|…)Query
e delega a componentes adicionais para realmente criar a consulta específica da loja. Por exemplo. para JPA os bits interessantes provavelmente estão em JpaQueryCreator.PredicateBuilder.build()
(consulte aqui
).