spring-data-jpa原理探祕(3)-QueryMethod類
很簡單,是不是,只有區區兩個相關類,QueryMethod及其子類JpaQueryMethod。
QueryMethod類位於spring-data-commons-***.jar包中;而JpaQueryMethod則位於spring-data-jpa-***.jar包中。也就是說,QueryMethod是spring-data包中的通用類;而JpaQueryMethod是spring-data-jpa實現中的類,擴充套件了通用包中的QueryMethod。
QueryMethod:一個被指定用於執行finder查詢的方法的抽象。豐富了標準java.lang.reflect.Method介面以及與具體特定的,必須為這個方法構造的RepositoryQuery資訊。
JpaQueryMethod:QueryMethod的JPA具體/特定擴充套件類。
QueryMethod類持有RepositoryMetadata,Method,Parameters,domainClass等幾個私有類變數。其中RepositoryMetadata儲存的是repository介面的元資料,類圖如下:
Parameters是一個JpaParameters例項,儲存的是引數名和引數值的鍵值對集合,JpaParameters還包含一個內部類JpaParameter,它extends Parameter;
domainClass通常被賦值為Repository介面泛型中定義的Class類,或者方法返回值的Class類;
開啟原始碼,我們驚訝的看到,JpaQueryMethod類也持有一個私有Method類變數,在這裡,我謹慎懷疑是開發人員在軟體設計時出現的一個小bug,既然父類持有了一個Method類變數,完全可以通過各種手段被子類繼承並使用嘛。
JpaQueryMethod類中包含了解析JPA 2.1規範中的支援儲存過程配置的若干類變數;以及QueryExtractor查詢提取器實現,通過這個設定,可以根據不同的實現,從jpa的Query中提取原始JPA查詢字串,在這裡,spring-data-jpa的預設Persistence Provider供應商實現是hibernate。
在spring-data-jpa中,JpaQueryMethod就是Repository介面中帶有@Query註解方法的全部資訊,包括註解,類名,實參等的儲存類,所以Repository介面有多少個@Query註解方法,就會包含多少個JpaQueryMethod例項被加入監聽序列。實際執行時,一個RepositoryQuery例項持有一個JpaQueryMethod例項,JpaQueryMethod又持有一個Method例項。
未完待續。