Spring Data生成的仓库实现是在编译时生成还是运行时生成?我能否看到Spring Data生成的实现仓库的实现细节?
不行,因为没有代码生成。实现基于代理和方法拦截器,将调用执行委托到正确的位置。
方法执行可以由以下3种类型的代码支持:
CrudRepository
的存储特定实现。查找名为Simple(Jpa|Mongo|Neo4|…)
的类型(例如JPA特定的一个此处)。它们对CrudRepository
和PagingAndSortingRepository
中的所有方法都有“真正”的实现。
查询方法实际上是由QueryExecutorMethodInterceptor.doInvoke(...)
执行的(请参见此处)。它基本上是一个3步过程,用于查找委托目标并调用它。实际执行是在名为(Jpa|Mongo|Neo4j…)
的类中完成的。例如,看这个。
自定义实现代码也直接从QueryExecutorMethodInterceptor
中调用。
仅剩的事情是查询派生,它由两个主要部分组成:方法名称解析和查询创建。对于前者,请查看PartTree
。它接受一个方法名称和一个基础类型,并返回一个解析后的类似AST的结构,如果无法解析属性或类似内容,则抛出异常。
PartTree(Jpa|Mongo|Neo4j|…)Query
的类中,并委托其他组件来实际创建存储特定查询。例如,对于JPA,有趣的部分可能在JpaQueryCreator.PredicateBuilder.build()
中(请参见此处)。