spring-data-jpa的优点很多,比如继承Repository接口,在注解中书写JPQL语句即可访问数据库;支持方法名解析方式访问数据库;使用Predicate支持动态查询等,在此不一一列举了。这些都是使用spring-data-jpa中的种种优点,要想将之使用的更好更优雅,就要从spring-data-jpa的加载和运行机制进行探秘。
此文系作者查看spring-data-jpa源码及参考javadoc文档成文,所以文中难免会有错误和纰漏,恳请读者指出。下面进入正题。
1.运行环境创建及加载Repository接口
spring-data-jpa在运行时和springframework框架实现了无缝对接。在使用spring的@Repository注解生成Repository实例时,使用动态代理类的方式对Repository接口进行了实例化并放入spring容器中备用。
下面是spring-data-jpa中占重要地位的RepositoryFactoryBeanSupport和RepositoryFactorySupport的类图:
RepositoryFactoryBeanSupport的作用是,为spring的FactoryBean接口开发的适配器,可以很便捷的通过spring配置设置repository工厂;而RepositoryFactorySupport的作用是,创建一个给定repository接口实例的工厂bean。创建一个实现配置的repository接口的代理,并应用一个advice将控制交给QueryExecuterMethodInterceptor。
通过查看源码,我们可以看到在RepositoryFactoryBeanSupport中持有一个私有RepositoryFactorySupport类变量,在执行RepositoryFactoryBeanSupport.afterPropertiesSet()方法时,通过createRepositoryFactory()方法,new了一个JpaRepositoryFactory实例并赋值给了类变量factory(RepositoryFactorySupport),查看JpaRepositoryFactory的构造器,可以看到持有了entityManager等实例,以方便后面的使用。
RepositoryFactoryBeanSupport中的private T initAndReturn()是另一个相当重要的方法,方法说明是:
Returns the previously initialized repository proxy or creates and returns the proxy if previously uninitialized.返回先前实例化了的repository代理实例,或者,如果先前没有实例化,那么生成并且返回一个代理实例。
为什么这么说明呢?我们来看代码,这个方法被另外两个方法调用,一个是afterPropertiesSet(),这是实现InitialingBean接口需要实现的一个加载方法,一般会先调用;另一个则是实现FactoryBean接口需要实现的getObject()方法,在运行中会调用之返回一个Repository接口的实例。所以,一般来说initAndReturn()至少会有两次被调用的机会。initAndReturn()的实现比较简单:
private T initAndReturn() {
Assert.notNull(repositoryInterface, "Repository interface must not be null on initialization!");
if (this.repository == null) {
this.repository = this.factory.getRepository(repositoryInterface, customImplementation);
}
return this.repository;
}
通过RepositoryFactorySupport(JpaRepositoryFactory实例)的getRepository(repositoryInterface, customImplementation);获取了一个org.springframework.data.jpa.repository.support.SimpleJpaRepository代理类实例(定义为泛型T extends Repository),在构造这个实例时,进行了一系列的运行环境准备:
在RepositoryFactorySupport的内部类QueryExecutorMethodInterceptor中获取Query查找策略类QueryLookupStrategy实例(此处一般是CreateIfNotFoundQueryLookupStrategy实例),然后执行resolveQuery(method, repositoryInformation, factory, namedQueries);方法将RepositoryQuery实例执行循环放入RepositoryFactorySupport(JpaRepositoryFactory实例)的类变量queries,一个ConcurrentHashMap<Method, RepositoryQuery>中。
下图是QueryLookupStrategy的类图:
构造RepositoryQuery实例时对应了一个JpaQueryMethod实例,RepositoryQuery实例实际上是SimpleJpaQuery实例。
上面的描述总括上来说,就是一个通过spring框架生成(注意不是注入生成)的JpaRepositoryFactoryBean实例实现了InitialzingBean接口,在public void afterPropertiesSet()方法调用时生成了一个SimpleJpaRepository代理实例。SimpleJpaRepository实例中持有本次实例化的Repository代理类,以及在QueryExecutorMethodInterceptor构造器中实例化了的多个JpaQueryMethod,顾名思义,JpaQueryMethod就是jpa的带有@Query注解的方法数据存储类,所以Repository接口有多少个方法,就会包含多少个JpaQueryMethod实例被加入监听序列。
分享到:
相关推荐
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
2. **EntityManager 和 Repository**:Spring Data JPA 封装了 `EntityManager` 和 `EntityTransaction`,使得开发者可以通过 Repository 接口直接操作,无需直接接触 JPA API。 3. **JPA 查询**:除了 Spring Data...
赠送jar包:spring-data-jpa-2.0.9.RELEASE.jar; 赠送原API文档:spring-data-jpa-2.0.9.RELEASE-javadoc.jar; 赠送源代码:spring-data-jpa-2.0.9.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-data-jpa...
- 可以直接在 Repository 接口中定义查询方法名,Spring-data-jpa 会根据方法名自动解析并执行相应的查询操作。例如: ```java List<User> findByUsername(String username); ``` 4. **分页和排序**: - 使用 ...
而创建repository实例通常是由Spring容器在运行时自动完成的,开发者只需要注入这些repository接口即可。 Spring Data JPA的另一个重要特性是分页和排序查询。通过继承`PagingAndSortingRepository`接口,开发者...
java运行依赖jar包
java运行依赖jar包
spring-data-jpa
该项目是一个基于SpringBoot框架构建的简单网上商城应用,利用了Spring-data-jpa进行数据库操作,Druid作为数据连接池,并采用Thymeleaf模板引擎来处理前端展示。下面将详细介绍这三个核心组件及其在项目中的作用。 ...
通过 Spring Data JPA,我们可以快速地创建数据访问层,包括基本的 CRUD(创建、读取、更新、删除)操作,而无需编写大量的模板代码。在这个实例中,我们将探讨如何设置和使用 Spring Data JPA 实现简单的数据库操作...
spring data jpa最新版本1.8.0,包含了spring-data-jpa-1.8.0.RELEASE.jar,spring-data-jpa-1.8.0.RELEASE-javadoc.jar以及 spring-data-jpa-1.8.0.RELEASE-sources.jar文档和源代码
java运行依赖jar包
java运行依赖jar包
spring-data-jpa-1.4.2.RELEASE.jar
java运行依赖jar包
spring-data-jpa-1.5.2
- Spring Data JPA 允许开发者定义自定义的 Repository 接口,通过继承 `JpaRepository` 或 `CrudRepository`,自动实现基本的查询操作。 - 可以使用 `@Query` 注解编写自定义 SQL 或 HQL 查询。 6. **服务层与...
3. **Repository接口**:Spring Data JPA允许我们定义Repository接口,通过继承`JpaRepository`或`CrudRepository`,无需编写实现即可自动获得CRUD方法。我们可以自定义接口,添加特定的查询方法,例如根据用户名...
Spring Data JPA是Spring框架的一部分,它提供了对Java Persistence API (JPA) 的简化封装,允许开发者通过面向接口的方式进行数据库操作,包括进行复杂的查询和分页。 首先,要启用Spring Data JPA功能,我们需要...