spring-data-jpa原理探祕(3)-QueryMethod類

第三篇,我們來說說JPA規範中的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實例。


未完待續。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章