sql >> Database teknologi >  >> NoSQL >> MongoDB

Hvordan ser man repository-implementeringen genereret af Spring Data MongoDB?

tl;dr

Nej, af en meget simpel grund:der er ingen kodegenerering i gang. Implementeringen er baseret på proxyer og en metodeinterceptor, der uddelegerer opkaldsudførelserne til de rigtige steder.

Detaljer

Effektivt kan en metodeudførelse understøttes af 3 typer kode:

  1. Den butiksspecifikke implementering af CrudRepository . Se efter typer med navnet Simple(Jpa|Mongo|Neo4|…)Repository (se den JPA-specifikke her ). De har "rigtige" implementeringer for alle metoderne i CrudRepository og PagingAndSortingRepository .

  2. Forespørgselsmetoder udføres effektivt af QueryExecutorMethodInterceptor.doInvoke(…) (se her ). Det er dybest set en 3-trins-proces at finde delegationsmålet og påberåbe det. Den faktiske udførelse udføres i klasser med navnet (Jpa|Mongo|Neo4j…)QueryExecution (se f.eks. denne).

  3. Tilpasset implementeringskode kaldes direkte, også fra QueryExecutorMethodInterceptor .

Det eneste, der er tilbage, er forespørgselsafledningen, som består af to hoveddele:analyse af metodenavn og oprettelse af forespørgsler. For førstnævnte, tag et kig på PartTree . Det kræver et metodenavn og en basistype og vil returnere dig en parset AST-lignende struktur eller kaste en undtagelse, hvis det ikke lykkes med at løse egenskaber eller lignende.

Sidstnævnte er implementeret i klasser med navnet PartTree(Jpa|Mongo|Neo4j|…)Query og delegerede til yderligere komponenter for faktisk at oprette den butiksspecifikke forespørgsel. For eksempel. for JPA er de interessante bits sandsynligvis i JpaQueryCreator.PredicateBuilder.build() (se her ).




  1. MongoDB forskel mellem DateTime-objekt og YYYY-MM-DD-streng

  2. Hvordan indstilles MongoDB Change Stream 'OperationType' i C#-driveren?

  3. MongoDB Aggregation:Tilføj felt fra et indlejret dokument via en dynamisk feltsti

  4. Absolut værdi med MongoDB aggregeringsramme