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

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

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时使用。


来源:http://ddrv.cn

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » Spring JPA实现逻辑源码分析总结

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏