spring-data-jpa原理探秘(3)-QueryMethod类

第三篇,我们来说说JPA规范中的QueryMethod相关类。首先给出类图和继承关系:
[img]https://static.oschina.net/uploads/space/2017/0119/221605_mkCm_75789.png[/img]
很简单,是不是,只有区区两个相关类,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接口的元数据,类图如下:
[img]https://static.oschina.net/uploads/space/2017/0119/221653_FoXs_75789.png[/img]
Parameters是一个JpaParameters实例,存储的是参数名和参数值的键值对集合,JpaParameters还包含一个内部类JpaParameter,它extends Parameter;
[img]https://static.oschina.net/uploads/space/2017/0119/221718_pEGw_75789.png[/img]
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实例。

未完待续。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值