tl; dr
Không, vì một lý do rất đơn giản:không có quá trình tạo mã nào diễn ra. Việc triển khai dựa trên proxy và một bộ đánh chặn phương thức ủy quyền việc thực thi cuộc gọi đến đúng nơi.
Chi tiết
Một cách hiệu quả, một phương thức thực thi có thể được hỗ trợ bởi 3 loại mã:
-
Cửa hàng triển khai cụ thể của
CrudRepository
. Tìm kiếm các loại có tênSimple(Jpa|Mongo|Neo4|…)Repository
(xem JPA cụ thể tại đây ). Chúng có các triển khai "thực" cho tất cả các phương thức trongCrudRepository
vàPagingAndSortingRepository
. -
Các phương thức truy vấn được thực thi hiệu quả bởi
QueryExecutorMethodInterceptor.doInvoke(…)
(xem tại đây ). Về cơ bản, đó là một quy trình 3 bước để tìm mục tiêu ủy quyền và gọi nó. Việc thực thi thực sự được thực hiện trong các lớp có tên(Jpa|Mongo|Neo4j…)QueryExecution
(xem ví dụ này). -
Mã triển khai tùy chỉnh được gọi trực tiếp, cũng từ
QueryExecutorMethodInterceptor
.
Điều duy nhất còn lại là dẫn xuất truy vấn, bao gồm hai phần chính:phân tích cú pháp tên phương thức và tạo truy vấn. Về phần trước, hãy xem PartTree
. Nó nhận một tên phương thức và một kiểu cơ sở và sẽ trả về cho bạn một cấu trúc giống như AST đã được phân tích cú pháp hoặc đưa ra một ngoại lệ nếu nó không giải quyết được các thuộc tính hoặc tương tự.
Sau đó được triển khai trong các lớp có tên PartTree(Jpa|Mongo|Neo4j|…)Query
và ủy quyền cho các thành phần bổ sung để thực sự tạo truy vấn cụ thể cho cửa hàng. Ví dụ. đối với JPA, các bit thú vị có thể nằm trong JpaQueryCreator.PredicateBuilder.build()
(xem tại đây
).