通常使用 Spring Data JPA 时,都会创建一个 BaseRepository,或者继承 Spring 已经预设的一些预设的接口例如 CrudRepository 等,以自建 BaseRepository 为例(为了简化只保留了一个方法):
|
|
加载基础配置:
|
|
以上就完成了基本配置可以使用 Spring Data JPA 了,回到本文的目的:如何添加一个自定义的默认方法?
为单个 Repository 添加自定义实现的方法很简单略过,下面以添加一个名为 findOneForUpdate 的自定义默认方法为例进行代码示例(即全局为每个 Entity 的 Repository 添加按 ID 锁行功能)。
首先创建一个新的接口 BaseInternalRepository :
|
|
修改原先的 BaseRepository,使其继承新的这个接口:
|
|
为新创建的 BaseInternalRepository 接口添加实现:
|
|
注:SimpleJpaRepository 即 Spring Data JPA 默认用来代理创建 Repository 实例的实现类。
接下来要把自定义的实现替换掉默认实现,先创建一个自定义的生成 Repository 实例的工厂类:
|
|
修改 JPA 配置使用自定义的工厂类:
大功告成!
基本原理是利用了 Repository 实例的创建过程:
- 查找是否有自定义的实现,如果有使用自定义实现提供的方法
- 如果还有未实现的方法,使用默认代理类中的方法,即 BaseInternalRepositoryImpl
通过这种方式,可以很方便的添加各种自定义的默认方法,如果有需要定制的,也可以在每个 Repository 的自定义实现中进行覆盖。