开发人员所定义的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。

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





