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