开发人员所定义的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
的初始化以及验证和元数据分析工作也已经完成了。- 对应配置选项
使用建议
- 如果启动时间上不是什么问题,就使用缺省的同步模式好了。
- 如果你想用异步方式启动
JPA
,又希望应用启动后所有的JPA
组件能正常工作,那可以使用延迟加载模式DEFERRED
。因为该模式中,JPA Respository
组件bean
的初始化,验证以及元数据分析,一定会在应用启动过程中统一的时机被触发执行。 - 而对于
LAZY
模式,通常用于测试或者本地开发环境。如果你很明确JPA Respository
组件bean
一定能够正常初始化,或者你只是在测试应用没有真正访问JPA Respository
组件bean
的部分,并且不想浪费时间等待这些组件的初始化,那么你就可以使用该模式。
在Spring Boot
应用中,可以参考自动配置类JpaRepositoriesAutoConfiguration
了解一下框架对该异步启动机制的实现。JpaRepositoriesAutoConfiguration
配置类会检测spring.data.jpa.repositories.bootstrap-mode
的值,如果它为deferred/lazy
,它会定义一个EntityManagerFactoryBuilderCustomizer
组件bean
,该组件会为EntityManagerFactoryBuilder
组件bean
指定一个启动载入执行器AsyncTaskExecutor
。