Spring Data JPA 的启动载入方式

博客介绍了框架的异步启动机制,该机制可通过配置属性完成,有缺省、懒加载、延迟加载三种模式。还给出使用建议,如启动时间无问题用缺省同步模式,想异步启动且组件正常工作用延迟加载模式,懒加载模式常用于测试或本地开发。此外提供了参考资料。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发人员所定义的JPA Respository最终都是以单例bean组件的形式存在的,并且缺省情况下会在容器启动时初始化。启动过程中,这些bean的创建会跟JPA EntityManager组件交互进行验证和元数据分析。

实际上,Spring框架支持EntityManagerFactory在一个后台进程中异步启动,因为该过程可能耗时较长。为了跟此机制有效配合,Spring框架也允许JPA Repository组件bean异步方式尽量晚些时候初始化。

Spring Data JPA 2.1版本之后,这一异步启动机制通过可以通过配置属性BootstrapMode来完成(可以通过注解@EnableJpaRepositories方式或者在XML配置文件中进行)。该配置属性有三个选项 :

  • DEFAULT
    • 对应配置选项spring.data.jpa.repositories.bootstrap-mode未使用或者值不为deferred/lazy

    缺省模式。不使用异步机制。容器启动过程中直接触发EntityManagerFactory/EntityManager和各个JPA Respository组件bean的初始化,此过程中完成相应的验证以及元数据分析工作。

  • LAZY
    • 对应配置选项spring.data.jpa.repositories.bootstrap-mode值为lazy

    懒加载模式。启动过程中JPA Respository组件bean并没有真正被初始化。注入到使用者的JPA Respository组件bean也只是懒加载机制生成的代理对象。这些JPA Respository组件bean仅在首次调用前才会被初始化,以及进行相应的验证和元数据分析。

  • DEFERRED
    • 对应配置选项spring.data.jpa.repositories.bootstrap-mode不存在或者值为deferred

    延迟加载模式。跟LAZY模式类似,注入到使用者的JPA Respository组件bean也是懒加载机制生成的代理对象。不同的时,这些JPA Respository组件bean真正的初始化时机不是在首次被调用时,而是统一在容器启动完成的ContextRefreshedEvent事件发生时。所以,这一点上又跟DEFAULT类似,可以认为应用真正启动完成时,这些JPA Respository组件bean的初始化以及验证和元数据分析工作也已经完成了。

使用建议

  1. 如果启动时间上不是什么问题,就使用缺省的同步模式好了。
  2. 如果你想用异步方式启动JPA ,又希望应用启动后所有的JPA 组件能正常工作,那可以使用延迟加载模式DEFERRED。因为该模式中,JPA Respository组件bean的初始化,验证以及元数据分析,一定会在应用启动过程中统一的时机被触发执行。
  3. 而对于LAZY模式,通常用于测试或者本地开发环境。如果你很明确JPA Respository组件bean一定能够正常初始化,或者你只是在测试应用没有真正访问JPA Respository组件bean的部分,并且不想浪费时间等待这些组件的初始化,那么你就可以使用该模式。

Spring Boot应用中,可以参考自动配置类JpaRepositoriesAutoConfiguration了解一下框架对该异步启动机制的实现。JpaRepositoriesAutoConfiguration配置类会检测spring.data.jpa.repositories.bootstrap-mode的值,如果它为deferred/lazy,它会定义一个EntityManagerFactoryBuilderCustomizer组件bean,该组件会为EntityManagerFactoryBuilder组件bean指定一个启动载入执行器AsyncTaskExecutor

参考资料

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值