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层对象可以通过方法操作数据库。
2685

被折叠的 条评论
为什么被折叠?



