MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como ver a implementação do repositório gerada pelo Spring Data MongoDB?

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:

  1. A implementação específica da loja de CrudRepository . Dê uma olhada nos tipos chamados Simple(Jpa|Mongo|Neo4|…)Repository (consulte o específico da JPA aqui ). Eles têm implementações "reais" para todos os métodos em CrudRepository e PagingAndSortingRepository .

  2. Os métodos de consulta são efetivamente executados por QueryExecutorMethodInterceptor.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).

  3. O código de implementação personalizado é chamado diretamente, também de QueryExecutorMethodInterceptor .

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