Spring Data JPA运行原理

Spring Data JPA运行原理

使用过Spring Data JPA的人都知道,自定义好dao层后,继承JpaRepository、JpaSpecificationExecutor,就可以实现对数据库基本的增删改查了。
这两天看了下源码,
-----接口继承结构

public interface JpaRepository<T, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {
}
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
}
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
    <S extends T> S save(S var1);
    <S extends T> Iterable<S> save(Iterable<S> var1);
    T findOne(ID var1);
    boolean exists(ID var1);
    Iterable<T> findAll();
    Iterable<T> findAll(Iterable<ID> var1);
    long count();
    void delete(ID var1);
    void delete(T var1);
    void delete(Iterable<? extends T> var1);
    void deleteAll();
}
public interface Repository<T, ID extends Serializable> {
}
public interface JpaSpecificationExecutor<T> {
    T findOne(Specification<T> var1);
    List<T> findAll(Specification<T> var1);
    Page<T> findAll(Specification<T> var1, Pageable var2);
    List<T> findAll(Specification<T> var1, Sort var2);
    long count(Specification<T> var1);
}

从源码中可以看出,接口的继承关系如下
-----> 表示继承
自定义接口-----> JpaRepository、JpaSpecificationExecutor
JpaRepository----->PagingAndSortingRepository---->CrudRepository----->Repository
JpaSpecificationExecutor没有继承父接口

PagingAndSortingRepository:提供了分页和排序的方法
CrudRepository:提供了CRUD方法,Spring Data JPA的基本方法都在这个接口中,该接口中的查询方法只支持根据主键ID查询或者查询所有数据
Repository:标识接口
JpaSpecificationExecutor:提供了条件查询的方法

通过以上这几个接口,Spring Data JPA就满足了基本的数据库操作。

-----运行原理
在使用dao调用Spring Data JPA方法时,打印接口对象,如下所示

@Autowired
    private MerBaseInfoDao merBaseInfoDao;
    public void test(){
        System.out.println(merBaseInfoDao);
        System.out.println(merBaseInfoDao.getClass());
    }
org.springframework.data.jpa.repository.support.SimpleJpaRepository@4580435
class sun.proxy.$Proxy122

从执行结果可以看出,dao层对象是一个SimpleJpaRepository类的代理对象,并且是基于JDK的动态代理。
看下SimpleJpaRepository类的实现

public class SimpleJpaRepository<T, ID extends Serializable> implements JpaRepository<T, ID>, JpaSpecificationExecutor<T> {}

SimpleJpaRepository类实现了JpaRepository和JpaSpecificationExecutor接口

Spring Data JPA在执行过程中通过动态代理生成了SimpleJpaRepository的代理对象给了dao层对象,SimpleJpaRepository类实现了Repository接口,所以dao层对象可以通过方法操作数据库。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值