sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo ver la implementación del repositorio generada por Spring Data MongoDB?

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:

  1. La implementación específica de la tienda de CrudRepository . Busque tipos llamados Simple(Jpa|Mongo|Neo4|…)Repository (ver el específico de JPA aquí ). Tienen implementaciones "reales" para todos los métodos en CrudRepository y PagingAndSortingRepository .

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

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