diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfiguration.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfiguration.java index 69accee93f0d..5c85ae6f0469 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfiguration.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfiguration.java @@ -96,13 +96,12 @@ private static final class BootstrapExecutorCondition extends AnyNestedCondition } @ConditionalOnProperty(prefix = "spring.data.jpa.repositories", name = "bootstrap-mode", - havingValue = "deferred", matchIfMissing = true) + havingValue = "deferred") static class DeferredBootstrapMode { } - @ConditionalOnProperty(prefix = "spring.data.jpa.repositories", name = "bootstrap-mode", havingValue = "lazy", - matchIfMissing = false) + @ConditionalOnProperty(prefix = "spring.data.jpa.repositories", name = "bootstrap-mode", havingValue = "lazy") static class LazyBootstrapMode { } diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesRegistrar.java b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesRegistrar.java index 008250a392ba..32f6a1628d54 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesRegistrar.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesRegistrar.java @@ -57,7 +57,7 @@ protected RepositoryConfigurationExtension getRepositoryConfigurationExtension() @Override protected BootstrapMode getBootstrapMode() { - return (this.bootstrapMode == null) ? BootstrapMode.DEFERRED : this.bootstrapMode; + return (this.bootstrapMode == null) ? BootstrapMode.DEFAULT : this.bootstrapMode; } @Override diff --git a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 66068efc3b18..40e775faf45b 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-boot-project/spring-boot-autoconfigure/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -622,7 +622,7 @@ "name": "spring.data.jpa.repositories.bootstrap-mode", "type": "org.springframework.data.repository.config.BootstrapMode", "description": "Bootstrap mode for JPA repositories.", - "defaultValue": "deferred" + "defaultValue": "default" }, { "name": "spring.data.jpa.repositories.enabled", diff --git a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfigurationTests.java b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfigurationTests.java index 31f90d940471..9437f7cf1efb 100644 --- a/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfigurationTests.java +++ b/spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/JpaRepositoriesAutoConfigurationTests.java @@ -126,13 +126,12 @@ void whenBootstrapModeIsDefaultBootstrapExecutorIsNotConfigured() { } @Test - void bootstrapModeIsDeferredByDefault() { + void bootstrapModeIsDefaultByDefault() { this.contextRunner.withUserConfiguration(MultipleAsyncTaskExecutorConfiguration.class) .withConfiguration(AutoConfigurations.of(TaskExecutionAutoConfiguration.class, TaskSchedulingAutoConfiguration.class)) .run((context) -> assertThat( - context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()) - .isEqualTo(context.getBean("applicationTaskExecutor"))); + context.getBean(LocalContainerEntityManagerFactoryBean.class).getBootstrapExecutor()).isNull()); } @Configuration(proxyBeanMethods = false) diff --git a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc index fee7e8bb423c..4c00ef3657db 100644 --- a/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc +++ b/spring-boot-project/spring-boot-docs/src/docs/asciidoc/spring-boot-features.adoc @@ -4263,6 +4263,8 @@ To enable deferred or lazy bootstrapping, set the configprop:spring.data.jpa.rep When using deferred or lazy bootstrapping, the auto-configured `EntityManagerFactoryBuilder` will use the context's `AsyncTaskExecutor`, if any, as the bootstrap executor. If more than one exists, the one named `applicationTaskExecutor` will be used. +NOTE: When using deferred or lazy bootstraping, make sure to defer any access to the JPA infrastructure after the application context bootstrap phase. + TIP: We have barely scratched the surface of Spring Data JPA. For complete details, see the {spring-data-jdbc-docs}[Spring Data JPA reference documentation]. diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTest.java b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTest.java index c12b3a743b3f..3133f5ca51dd 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTest.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/main/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTest.java @@ -103,11 +103,11 @@ /** * The {@link BootstrapMode} for the test repository support. Defaults to - * {@link BootstrapMode#LAZY}. + * {@link BootstrapMode#DEFAULT}. * @return the {@link BootstrapMode} to use for testing the repository */ @PropertyMapping("spring.data.jpa.repositories.bootstrap-mode") - BootstrapMode bootstrapMode() default BootstrapMode.LAZY; + BootstrapMode bootstrapMode() default BootstrapMode.DEFAULT; /** * Determines if default filtering should be used with diff --git a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestIntegrationTests.java b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestIntegrationTests.java index efa6b14117d4..723dd514eddd 100644 --- a/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestIntegrationTests.java +++ b/spring-boot-project/spring-boot-test-autoconfigure/src/test/java/org/springframework/boot/test/autoconfigure/orm/jpa/DataJpaTestIntegrationTests.java @@ -109,9 +109,9 @@ void liquibaseAutoConfigurationWasImported() { } @Test - void bootstrapModeIsLazyByDefault() { + void bootstrapModeIsDefaultByDefault() { assertThat(this.applicationContext.getEnvironment().getProperty("spring.data.jpa.repositories.bootstrap-mode")) - .isEqualTo(BootstrapMode.LAZY.name()); + .isEqualTo(BootstrapMode.DEFAULT.name()); } }