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实例。

未完待续。

猜你喜欢

转载自sharong.iteye.com/blog/2354129