tl; dr
いいえ、非常に単純な理由で、コード生成は行われていません。実装は、プロキシとメソッドインターセプターに基づいており、呼び出しの実行を適切な場所に委任します。
詳細h2>
事実上、メソッドの実行は3種類のコードによって裏付けられます。
-
CrudRepository
のストア固有の実装 。Simple(Jpa|Mongo|Neo4|…)Repository
という名前のタイプを探してください (JPA固有のものここ )。CrudRepository
のすべてのメソッドに「実際の」実装があります。 およびPagingAndSortingRepository
。 -
クエリメソッドは、
QueryExecutorMethodInterceptor.doInvoke(…)
によって効果的に実行されます。 (ここ )。基本的に、委任ターゲットを見つけて呼び出すのは3ステップのプロセスです。実際の実行は、(Jpa|Mongo|Neo4j…)QueryExecution
という名前のクラスで行われます。 (たとえば、これを参照してください)。 -
カスタム実装コードは、
QueryExecutorMethodInterceptor
からも直接呼び出されます。 。
残っているのはクエリの派生だけです。これは、メソッド名の解析とクエリの作成という2つの主要な部分で構成されています。前者については、PartTree
をご覧ください。 。メソッド名と基本タイプを受け取り、解析されたASTのような構造を返すか、プロパティなどの解決に失敗した場合は例外をスローします。
後者は、PartTree(Jpa|Mongo|Neo4j|…)Query
という名前のクラスに実装されています。 ストア固有のクエリを実際に作成するための追加コンポーネントに委任します。例えば。 JPAの場合、興味深いビットはおそらくJpaQueryCreator.PredicateBuilder.build()
にあります。 (ここ
。