RepositoryFactoryBeanSupport
1,创建工厂,获取entitymanager afterPropertiesSet
2,获取工厂代理,包括 查询类策略RepositoryQuery实例即@Query标签的 放到map中 initAndReturn
一个RepositoryQuery实例持有一个JpaQueryMethod实例,JpaQueryMethod又持有一个Method实例。一个被标注的方法就有一个JpaQueryMethod一个RepositoryQuery
initAndReturn中new QueryExecutorMethodInterceptor:
Iterable<Method> queryMethods = repositoryInformation.getQueryMethods();
for (Method method : queryMethods) {
RepositoryQuery query = lookupStrategy.resolveQuery(method, repositoryInformation, namedQueries); 创建RepositoryQuery
invokeListeners(query);
queries.put(method, query);
}
JpaQueryLookupStrategy:
public final RepositoryQuery resolveQuery(Method method, RepositoryMetadata metadata, NamedQueries namedQueries) {
return resolveQuery(new JpaQueryMethod(method, metadata, provider), em, namedQueries);
}
JpaQueryLookupStrategy内部类CreateIfNotFoundQueryLookupStrategy:
@Override
protected RepositoryQuery resolveQuery(JpaQueryMethod method, EntityManager em, NamedQueries namedQueries) {
try {
return lookupStrategy.resolveQuery(method, em, namedQueries);
} catch (IllegalStateException e) {
return createStrategy.resolveQuery(method, em, namedQueries);
}
}
JpaQueryLookupStrategy:private static class CreateQueryLookupStrategy extends AbstractQueryLookupStrategy {
@Override
protected RepositoryQuery resolveQuery(JpaQueryMethod method, EntityManager em, NamedQueries namedQueries) {
RepositoryQuery query = JpaQueryFactory.INSTANCE.fromQueryAnnotation(method, em, evaluationContextProvider);
if (null != query) {
return query;
}
query = JpaQueryFactory.INSTANCE.fromProcedureAnnotation(method, em);
if (null != query) {
return query;
}
String name = method.getNamedQueryName();
if (namedQueries.hasQuery(name)) {
return JpaQueryFactory.INSTANCE.fromMethodWithQueryString(method, em, namedQueries.getQuery(name),
evaluationContextProvider);
}
query = NamedQuery.lookupFrom(method, em);
if (null != query) {
return query;
}
throw new IllegalStateException(String.format(
"Did neither find a NamedQuery nor an annotated query for method %s!", method));
}
///这里决定用什么query
//SimpleJpaQuery
//NativeJpaQuery
//PartTreeJpaQuery
//NamedQuery
//StoredProcedureJpaQuery
JpaQueryFactory:
AbstractJpaQuery fromMethodWithQueryString(JpaQueryMethod method, EntityManager em, String queryString,
EvaluationContextProvider evaluationContextProvider) {
if (queryString == null) {
return null;
}
return method.isNativeQuery() ? new NativeJpaQuery(method, em, queryString, evaluationContextProvider, PARSER) : //
new SimpleJpaQuery(method, em, queryString, evaluationContextProvider, PARSER);
}
JpaQueryMethod 就是Repository接口中带有@Query注解方法的全部信息,包括注解,类名,实参等的存储类,所以Repository接口有多少个@Query注解方法,
就会包含多少个JpaQueryMethod实例被加入监听序列。实际运行时,一个RepositoryQuery实例持有一个JpaQueryMethod实例,JpaQueryMethod又持有一个Method实例。
工具类
Parameters是一个JpaParameters实例,存储的是参数名和参数值的键值对集合,JpaParameters还包含一个内部类JpaParameter,它extends Parameter;
JpaQueryExecution
抽象类和继承类也可以放在一个类中,继承类当作抽象类的内部类
spring-data-jpa使用了内部类来实现JpaQueryExecution的子类,也就是包含多个查询运行策略的(子)类。这么做其实是一种相对的封闭形式,
造成使用者只能实例化spring-data-jpa给出的这8种子类。你无法实现自己的JpaQueryExecution子类,在spring框架初始化时通过配置加载之。
AbstractJpaQuery 用来选择具体那种JpaQueryExecution子类
JpaQueryExecution内部类SingleEntityExecution:
static class SingleEntityExecution extends JpaQueryExecution {
@Override
protected Object doExecute(AbstractJpaQuery query, Object[] values) {
return query.createQuery(values).getSingleResult();/////这里正式使用orm联系数据库
}
}
SingleEntityExecution只覆盖了一个父类方法,而且实现里只有一条语句query.createQuery(values).getSingleResult();在执行这句时,
会调用底层数据库访问提供商,spring-data-jpa默认选择的是hibernate,执行数据库存取操作之后,将结果返回给这个JpaQueryExecution实例。
参考:
http://blog.csdn.net/gaolu/article/details/53415420
相关推荐
赠送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...
赠送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...
java运行依赖jar包
这两个模块的 jar 文件,`spring-data-commons-1.7.2.RELEASE.jar` 和 `spring-data-jpa-1.5.2.RELEASE.jar`,包含了它们各自的功能实现和依赖。在实际项目中,将这些 jar 文件添加到类路径,就可以利用 Spring Data...
java运行依赖jar包
spring-data-jpa
### Spring-data-jpa 的核心知识点解析 #### 一、Spring-data-jpa 基本介绍 Spring-data-jpa 是 Spring 家族中的一个重要成员,它主要用于简化基于 Java Persistence API (JPA) 的数据访问层(DAO)的开发工作。...
在开发过程中,从聚合根处发布事件是一种常见的设计模式,Spring Data JPA 支持通过Spring Data的事件机制来实现这一功能。开发者可以在保存实体时触发事件,然后由事件监听器来响应这些事件。 Spring Data JPA ...
该项目是一个基于SpringBoot框架构建的简单网上商城应用,利用了Spring-data-jpa进行数据库操作,Druid作为数据连接池,并采用Thymeleaf模板引擎来处理前端展示。下面将详细介绍这三个核心组件及其在项目中的作用。 ...
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文档和源代码
spring-data-jpa-1.4.2.RELEASE.jar
java运行依赖jar包
java运行依赖jar包
**Spring Data JPA 简单实例** Spring Data JPA 是 Spring 框架的一个模块,它极大地简化了与 Java 持久层的交互,尤其是与 JPA(Java Persistence API)的集成。通过 Spring Data JPA,我们可以快速地创建数据访问...
java运行依赖jar包
spring-data-jpa-1.5.2
spring data jpa的包。spring-data-commons-1.8.0.RELEASE.jar
这个名为 "spring-data-jpa-example" 的项目是一个面向初学者的示例,旨在帮助理解并掌握 Spring Data JPA 的基本用法。 1. **Spring Data JPA 概述** - Spring Data JPA 是 Spring Framework 的一个模块,它简化...
spring-data-jpa-extra可以解决三个问题: 动态本地查询支持,例如mybatis 返回类型可以是任何东西没有代码,只有sql例子首先添加ComponentScan 通过java bean @ComponentScan ({ " com.slyak " , " your.base....