博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring data jpa 梳理
阅读量:6916 次
发布时间:2019-06-27

本文共 2577 字,大约阅读时间需要 8 分钟。

hot3.png

一直搞不懂栋哥的各种EQ啊EXIST啊什么的,说实话,我非常讨厌数据库和sql...

但是,逃不掉的,必须要看懂了 /(ㄒoㄒ)/~~


继承关系

先来一张图

首先,我们需要继承以加入框架

service

@Servicepublic class UserService extends DcBaseService
{ @Autowired private UserRepo userRepo;}

repo

public interface UserRepo extends DcJpaRepository
{}

service 和 repo 层的代码几乎什么都不用写。

场景

这里来看一次分页的过程。

UserService 调用父类 DcBaseServicequeryPage 方法。

DcJpaRepository代码

@NoRepositoryBeanpublic interface DcJpaRepository
extends JpaRepository
{ Page
queryPage(DcQuery var1); }

DcBaseService代码

@Transactionalpublic class DcBaseService
{ @Autowired private DcJpaRepository
dcJpaRepository; public Page
queryPage(DcQuery dcQuery) { return this.dcJpaRepository.queryPage(dcQuery); }}

DcBaseService中的queryPage 方法中调用了自动注入的 dcJpaRepository 实例,但这个实例到底是什么呢?

回头来看,UserService 中的 userRepo 也是自动注入的。

对于dcJpaRepositoryuserRepouserRepo的类型是dcJpaRepository的子类,User也可以看成T的子类, 那么,这两者应该是同一个实例,即子类实例userRepo,但userRepo的类型是接口,它的实例从哪来?

Debug

于是开始debug,两种情况如下

  1. UserService 自有方法

    UserController

    @GetMapping("/123")public void getAll(@PageableDefault Pageable page) {    System.out.println(ticketService.ticketRepo);    ticketService.findAllabc();    //        ticketService.queryPage(null);}

    UserService

    public void findAllabc() {    System.out.println(this.ticketRepo);}

    由此可见,实例类型为DcJpaRepositorySupport,顺便看到了 Spring 的依赖,是在方法调用需要时才注入(想想都是一个很复杂的过程)。

  2. DcBaseService 父类方法

    UserController

    @GetMapping("/123")public void getAll(@PageableDefault Pageable page) {    System.out.println(ticketService.ticketRepo);    //        ticketService.findAllabc();    ticketService.queryPage(null);}

    DcBaseService

    public Page
    queryPage(DcQuery dcQuery) { return this.dcJpaRepository.queryPage(dcQuery);}

    如图,实例类型还是DcJpaRepositorySupport

通过以上两种情况,查看这个DcJpaRepositorySupport源码如下

public class DcJpaRepositorySupport
extends SimpleJpaRepository
implements DcJpaRepository
{ public Page
queryPage(DcQuery dcQuery) { return this.findAll(.......); }}

分析

Ok,再回头看最初的类图,推论如下:

  1. 正如直接写UserRepo继承JpaRepository一样,后者定义的方法,如findOne,是由SimpleJpaRepository类来实现的。 queryPage是由DcJpaRepository接口定义,DcJpaRepositorySupport实现的。

  2. 因为多态,Spring 可以通过类型自动注入子类实例,而这个实现类,必然加持@Repository注解(或其它), 之所以DcJpaRepositorySupport可以被注入,是因为它继承了SimpleJpaRepository

  3. 如果没有自定义的Repository实现,继承DcBaseService的 service 可以不用再注入任何 xxxRepo,因为 Spring 根本就不会找上门来。

转载于:https://my.oschina.net/u/3035165/blog/1575639

你可能感兴趣的文章
#pragma once与 #ifndef的区别
查看>>
Spark排错与优化
查看>>
关于Java线程状态
查看>>
详解DNS的常用记录(上):DNS系列之二
查看>>
重定向与管道
查看>>
redhat6.1 X86-64 使用centos的源做yum
查看>>
闭包那一点事
查看>>
开源文化
查看>>
shell 中eval运用
查看>>
Scala之旅-class和object详解
查看>>
DNS服务的搭建 windows server 2008
查看>>
mysql报错err1055
查看>>
OpenStack 学习笔记(六):OpenStack neutron服务搭建
查看>>
shell中的算数比较
查看>>
quota(linux下的磁盤配額)
查看>>
【MySQL数据库开发之四】MySQL 处理模式/常用查询/模式匹配等
查看>>
Linux NFS服务器配置
查看>>
C++实现计数排序
查看>>
PPT组件Aspose.Slides V17.8发布 | 支持PP2010 PPTX与嵌入式视频
查看>>
Postfix全功能 (1)
查看>>