如何查看由Spring Data MongoDB生成的存储库实现?

17
Spring Data生成的仓库实现是在编译时生成还是运行时生成?我能否看到Spring Data生成的实现仓库的实现细节?

1
很抱歉,这两个评论与问题完全无关。 - Oliver Drotbohm
1个回答

22

简述

不行,因为没有代码生成。实现基于代理和方法拦截器,将调用执行委托到正确的位置。

详情

方法执行可以由以下3种类型的代码支持:

  1. CrudRepository的存储特定实现。查找名为Simple(Jpa|Mongo|Neo4|…)的类型(例如JPA特定的一个此处)。它们对CrudRepositoryPagingAndSortingRepository中的所有方法都有“真正”的实现。

  2. 查询方法实际上是由QueryExecutorMethodInterceptor.doInvoke(...)执行的(请参见此处)。它基本上是一个3步过程,用于查找委托目标并调用它。实际执行是在名为(Jpa|Mongo|Neo4j…)的类中完成的。例如,看这个。

  3. 自定义实现代码也直接从QueryExecutorMethodInterceptor中调用。

仅剩的事情是查询派生,它由两个主要部分组成:方法名称解析和查询创建。对于前者,请查看PartTree。它接受一个方法名称和一个基础类型,并返回一个解析后的类似AST的结构,如果无法解析属性或类似内容,则抛出异常。

后者实现在名为PartTree(Jpa|Mongo|Neo4j|…)Query的类中,并委托其他组件来实际创建存储特定查询。例如,对于JPA,有趣的部分可能在JpaQueryCreator.PredicateBuilder.build()中(请参见此处)。

嗨,Oliver,你能否解释一下QueryExecutorMethodInterceptor的工作原理以及委托和调用发生的时间? - xabhi
@xabhi — 你可能想看一下这个答案。https://dev59.com/4lkT5IYBdhLWcg3wf_lN#38511337 - Oliver Drotbohm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接