From 06671aa50eb73d47eba58cc670a0a765cb7b51d7 Mon Sep 17 00:00:00 2001 From: Stephane Nicoll Date: Tue, 8 Dec 2020 15:42:14 +0100 Subject: [PATCH] Stop deferring JPA bootstrap mode by default This commit changes the default value of bootstrap-mode to "default" rather than "deferred" so that the JPA infrastructure starts in the main thread rather than asynchronously. Closes gh-24249 --- .../data/jpa/JpaRepositoriesAutoConfiguration.java | 5 ++--- .../autoconfigure/data/jpa/JpaRepositoriesRegistrar.java | 2 +- .../META-INF/additional-spring-configuration-metadata.json | 2 +- .../data/jpa/JpaRepositoriesAutoConfigurationTests.java | 5 ++--- .../src/docs/asciidoc/spring-boot-features.adoc | 2 ++ .../boot/test/autoconfigure/orm/jpa/DataJpaTest.java | 4 ++-- .../autoconfigure/orm/jpa/DataJpaTestIntegrationTests.java | 4 ++-- 7 files changed, 12 insertions(+), 12 deletions(-) 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 a53c61fea3b3..0c9ec2a1b1d7 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 309d565996c6..4e504a3af122 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 @@ -3839,6 +3839,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 efe3b4aac65c..df6627faa19e 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()); } }