SpringBoot Jpa的SimpleJpaRepository
SimpleJpaRepository
先看结构
SimpleJpaRepository
实现了JpaRepositoryImplementation
接口,它是CrudRepository
的默认实现;SimpleJpaRepository
的构造方法都包含EntityManager
,从这里可以看出来,SimpleJpaRepository
是通过EntityManager
实现具体功能的。SimpleJpaRepository
代码太长就不贴出来了,比较值得注意的地方是:类上注解了@Transactional(readOnly = true)
,delete*、save*、flush
等都添加了@Transactional
注解。- 对于查询功能很多都借助了applySpecificationToCriteria方法,将spring data的Specification转换为javax.persistence的CriteriaQuery
- 正常
JPA
继承JpsRepository
接口,此接口继承的PagingAndSortingRepository
有分页和排序。自定义repository
时,就需要对JpsRepository
与CrudRepository
有所选择。
JpaRepositoryFactory
简单介绍了一下SimpleJpaRepository
就不得不说JpaRepositoryFactory
,这才是基础。
先看关系:
JpaRepositoryFactory
的getTargetRepository
会根据RepositoryInformation
创建JpaRepositoryImplementation
,这里默认创建的是SimpleJpaRepository
实例RepositoryFactorySupport
的getRepository
方法在调用子类的getTargetRepository
创建SimpleJpaRepository
实例之后,会对其进行proxy
,设置其接口为用户定义的dao
接口、Repository、TransactionalProxy
,并添加了SurroundingTransactionDetectorMethodInterceptor、DefaultMethodInvokingMethodInterceptor、QueryExecutorMethodInterceptor、ImplementationMethodExecutionInterceptor
等MethodInterceptor
,最后生成最终的实现类