tl;dr
Tidak, untuk alasan yang sangat sederhana:tidak ada pembuatan kode yang terjadi. Implementasinya didasarkan pada proxy dan pencegat metode yang mendelegasikan eksekusi panggilan ke tempat yang tepat.
Detail
Secara efektif, eksekusi metode dapat didukung oleh 3 jenis kode:
-
Implementasi khusus toko dari
CrudRepository
. Lihat jenis bernamaSimple(Jpa|Mongo|Neo4|…)Repository
(lihat yang spesifik JPA di sini ). Mereka memiliki implementasi "nyata" untuk semua metode diCrudRepository
danPagingAndSortingRepository
. -
Metode kueri dijalankan secara efektif oleh
QueryExecutorMethodInterceptor.doInvoke(…)
(lihat di sini ). Ini pada dasarnya adalah proses 3 langkah untuk menemukan target delegasi dan memintanya. Eksekusi sebenarnya dilakukan di kelas bernama(Jpa|Mongo|Neo4j…)QueryExecution
(lihat yang ini misalnya). -
Kode implementasi khusus dipanggil secara langsung, juga dari
QueryExecutorMethodInterceptor
.
Satu-satunya yang tersisa adalah derivasi kueri, yang terdiri dari dua bagian utama:penguraian nama metode dan pembuatan kueri. Untuk yang pertama, lihat PartTree
. Dibutuhkan nama metode dan tipe dasar dan akan mengembalikan Anda struktur seperti AST yang diurai atau memberikan pengecualian jika gagal menyelesaikan properti atau sejenisnya.
Yang terakhir diimplementasikan di kelas bernama PartTree(Jpa|Mongo|Neo4j|…)Query
dan mendelegasikan ke komponen tambahan untuk benar-benar membuat kueri khusus toko. Misalnya. untuk JPA bit yang menarik mungkin ada di JpaQueryCreator.PredicateBuilder.build()
(lihat di sini
).