`

Spring JPA实现逻辑源码分析总结

阅读更多

1、TransactionSynchronizationManager,事务资源同步,ThreadLocal都在这里。

2、SharedEntityManagerCreator,entitymanager的创建入口都是通过该类,该类被EntityManagerBeanDefinitionRegistrarPostProcessor注册到beanfactory中,依赖EntityManager bean实例的,都会调用该类的工厂方法createSharedEntityManager,而该工厂方法的参数是EntityManagerFactory,通过BeanDefinitionUtils找到类型为“EntityManagerFactory.class, AbstractEntityManagerFactoryBean.class”的所有BeanDefinition,针对找到的每个BeanDefinition,注册一个EntityManager的BeanDefinition(实际是通过SharedEntityManagerCreator的createSharedEntityManager方法创建的)

EntityManagerBeanDefinitionRegistrarPostProcessor的注释:主要用于构造函数引用EntityManager的,并且使用了qualifier 注解的,对于多个EntityManagerFactory中指定一个是有效的方式。

3、PersistenceAnnotationBeanPostProcessor用来处理persistencecontext,persistenceunit两个注解,用来注入EntityManager,实际上注入方式和上面一样,只不过是直接调用SharedEntityManagerCreator的createSharedEntityManager方法,位于PersistenceAnnotationBeanPostProcessor$PersistenceElement类内。

4、EntityManager不是线程安全的,EntityManagerFactory是线程安全的,所以需要每次都在线程中生成新的EntityManager。而spring通过SharedEntityManagerCreator在创建时增加Proxy的方式,间接的实现了线程安全,因为注入到容器的EntityManager是个Proxy,所有的调用会委托给SharedEntityManagerInvocationHandler去处理。

5、JpaRepository中的EntityManager的注入也是通过SharedEntityManagerCreator的工厂方法创建的。参见JpaRepositoryConfigExtension.getEntityManagerBeanDefinitionFor

 

6、JpaRepositoryFactoryBean是创建JpaRepository的工厂类,实际创建过程委托给JpaRepositoryFactory类执行,在创建JpaRepositoryFactory时,通过加入TransactionalRepositoryProxyPostProcessor,在创建JpaRepository过程中加入TransactionInterceptor,执行JpaRepository方法时,会自动加入事务处理。TransactionInterceptor中会注入配置的TransactionManager(比如JpaTransactionManager)

7、@Transactional注解,也是生成TransactionInterceptor的代理,原理同上。

8、直接通过注入EntityManger执行查询或者保存操作的,由于注入的EntityManager是SharedEntityManagerInvocationHandler的Proxy,会通过EntityManagerFactoryUtils.doGetTransactionalEntityManager获取已经存在的事务的EntityManager,如果不存在,则会创建一个EntityManager,等调用结束,关闭该新建的EntityManager。

9、JpaMetamodelMappingContextFactoryBean用来生成JpaMetamodelMappingContext,该FactoryBean创建实例时,遍历所有的EntityManagerFactory,调用EntityManagerFactory.getMetamodel,将所有的Metamodel加入到一个集合,然后传入JpaMetamodelMappingContext,在将来创建Entity时使用。

1
1
分享到:
评论

相关推荐

    Spring Data JPA Examples 官方源码

    Spring Data JPA是Spring框架的一个重要模块,它简化了Java ...通过学习和分析这些官方源码,开发者可以更好地掌握Spring Data JPA的工作原理,提升开发效率,同时避免常见的JPA陷阱,实现更优雅、更高效的数据库操作。

    jpa整合spring源码

    通过分析`sj`压缩包中的源码,我们可以学习到JPA如何与Spring Data JPA协同工作,理解它们在实际项目中的应用方式。同时,也可以从中学习到Spring框架如何管理bean、处理事务以及如何通过Repository接口执行数据库...

    spring data jpa 动态更新@DynamicUpdate

    源码分析可以帮助我们更好地理解JPA是如何处理动态更新的,以及在特定情况下如何优化代码以充分利用这一特性。 至于“工具”标签,可能指的是使用一些辅助工具如数据库查询分析器或日志分析工具,来追踪和分析`@...

    SpringDataJpa整合FreeMarker源码样例

    《SpringDataJpa整合FreeMarker源码解析》 在当今的软件开发中,Spring Boot、Spring Data JPA和FreeMarker的整合已经成为了构建高效、简洁Web应用的常见选择。本篇将深入探讨如何将这三个强大的工具结合在一起,...

    spring_jpa源代码

    Spring JPA是Spring框架...通过对Spring JPA的源代码分析,我们可以深入了解其内部机制,更好地利用其特性,优化数据访问性能,并实现高效且易于维护的业务逻辑。同时,了解源码也有助于我们遇到问题时进行调试和解决。

    SpringData和Spring和JPA的整合

    在SpringData&Jpa这个压缩包中,可能包含了示例项目的源码,包括了配置文件、实体类、Repository接口和业务逻辑类。通过阅读和分析这些代码,可以更直观地理解SpringData和JPA如何在实际项目中协同工作,提高开发...

    springboot+spring data jpa+thymeleaf学习web项目整合demo源码

    通过分析这个项目,开发者可以深入理解 Spring Boot、Spring Data JPA 和 Thymeleaf 之间的协同工作方式,掌握如何利用它们快速开发 Web 应用。同时,这也是一个很好的学习资源,可以帮助初学者理解实际项目中的架构...

    springdatajpa源码.rar

    《SpringDataJPA系列教程》源码分析 在SpringBoot框架中,SpringDataJPA是一个强大的持久层解决方案,它简化了数据库操作,使得开发者能够更专注于业务逻辑而非底层的SQL语句。本教程源码主要基于SpringBoot 2.0.3...

    spring boot+jpa+thymeleaf 练习demo项目源码

    在本项目中,"spring boot+jpa+thymeleaf 练习demo项目源码"是一个结合了Spring Boot、JPA(Java Persistence API)和Thymeleaf的实践示例,旨在帮助开发者学习和理解这三者之间的集成与应用。让我们深入探讨这些...

    eladmin jpa版本:前端源码,项目基于 Spring Boot 2.1.0 、 Spring Boot Jp.zip

    前端源码分析** 前端源码部分可能采用了现代化的前端框架,如 React、Vue 或 Angular,用于构建用户界面。这些框架提供了组件化开发、状态管理、路由等功能,使得前端代码更加模块化,易于维护。常见的前端构建工具...

    spring源码分析(一)

    ### Spring源码分析知识点 #### 一、Spring框架概述 Spring框架是一个全面的企业级应用开发框架,它通过一系列模块化的组件来支持不同的应用场景和技术需求。Spring的核心价值在于提供了一种简洁的方式来解决企业...

    spring高级源码分析

    《Spring高级源码分析》是针对Java开发人员深入理解Spring框架的一份宝贵资源。Spring作为Java企业级应用的基石,其强大的功能和灵活性源于其深厚的设计理念和精巧的源码实现。本分析将深入探讨Spring的核心机制,...

    spring framework 3.2.2的源码+build.xml

    源码分析可以帮助我们理解Spring是如何实现动态代理并执行切面逻辑的。 除此之外,Spring的事务管理也是其强项。在3.2.2版本中,Spring提供了声明式事务管理,允许开发者通过注解或配置文件来控制事务边界。源码中...

    spring源码

    Spring框架是Java开发中的核心组件,它为应用程序提供了一个全面的基础设施,支持...通过分析源码,开发者还可以了解到如何设计和实现一个可扩展、可维护的框架,这对于提升自身的技术水平和解决问题的能力大有裨益。

    spring5源码分析笔记

    Spring5源码分析笔记旨在深入理解Spring的工作原理,帮助开发者提升技能,优化代码,以及更好地利用其核心特性。以下是对Spring5源码的一些关键知识点的详细解释: 1. **依赖注入(Dependency Injection,DI)**:...

    基于Spring+JPA+Velocity+Ehcache的商城系统源码.zip

    通过Spring MVC模块,实现了MVC(Model-View-Controller)设计模式,使得业务逻辑、数据和视图之间解耦,便于维护和扩展。 **JPA(Java Persistence API)**: JPA是Java标准的持久化框架,它提供了一种对象/关系...

    spring-orm源码

    源码分析可以让我们学习到如何在测试环境中配置和使用Spring-ORM。 通过深入研究Spring-ORM的源码,开发者不仅可以提高对Spring框架的理解,还能学习到数据库访问的最佳实践,以及如何高效地集成和使用不同的ORM...

    Spring Boot实战派(源码)

    《Spring Boot实战派》源码提供了丰富的学习材料,旨在帮助开发者深入理解并...通过分析《Spring Boot实战派》源码,读者不仅可以了解上述技术点,还能学习到如何在实际项目中应用这些技术,提升开发效率和代码质量。

    Spring和openJPA集成

    而OpenJPA则是一个开源的JPA(Java Persistence API)实现,它为Java应用程序提供了对象关系映射(ORM)的能力,使得开发者可以方便地在Java对象和数据库记录之间进行交互。 **一、Spring框架** Spring的核心在于...

    【狂神说】spring 总结源码 下载

    8. **源码分析**:深入研究Spring源码有助于我们理解其内部工作机制,例如Bean的加载流程、AOP的实现原理、事务管理的策略等。这不仅可以提升我们的技术水平,也有助于我们在实际开发中更好地利用Spring框架。 在...

Global site tag (gtag.js) - Google Analytics