Spring Data生成的存储库实现是什么时候?在编译时还是运行时?我能看到Spring Data生成的实现存储库实现吗?
答案 0 :(得分:14)
不,原因很简单:没有代码生成。该实现基于代理和方法拦截器将调用执行委派给正确的位置。
实际上,方法执行可以由3种类型的代码支持:
CrudRepository
的商店特定实施。查看名为Simple(Jpa|Mongo|Neo4|…)Repository
的类型(请参阅JPA特定的here)。他们有真实的" CrudRepository
和PagingAndSortingRepository
中所有方法的实现。
查询方法由QueryExecutorMethodInterceptor.doInvoke(…)
有效执行(请参阅here)。它基本上是一个三步过程来查找委托目标并调用它。实际执行是在名为(Jpa|Mongo|Neo4j…)QueryExecution
的类中完成的(例如,见这一个)。
QueryExecutorMethodInterceptor
。唯一剩下的是查询派生,它由两个主要部分组成:方法名称解析和查询创建。对于前者,请查看PartTree
。它需要一个方法名称和一个基本类型,并将返回一个解析的类似AST的结构,或者如果它无法解析属性等,则抛出异常。
后者在名为PartTree(Jpa|Mongo|Neo4j|…)Query
的类中实现,并委托其他组件实际创建特定于商店的查询。例如。对于JPA,有趣的位可能在JpaQueryCreator.PredicateBuilder.build()
中(参见here)。