From e29853fcc71c73e2b6b2897f42f72611448ab677 Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Tue, 21 May 2024 00:57:08 +0200 Subject: [PATCH] GH-587 - Avoid repeated lookup of ApplicationModules in ApplicationModulesRuntime. --- .../runtime/ApplicationModulesRuntime.java | 3 +- ...icationModulesRuntimeIntegrationTests.java | 34 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/ApplicationModulesRuntime.java b/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/ApplicationModulesRuntime.java index 629f158a..5aea0a0c 100644 --- a/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/ApplicationModulesRuntime.java +++ b/spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/ApplicationModulesRuntime.java @@ -19,6 +19,7 @@ import java.util.function.Supplier; import org.springframework.modulith.core.ApplicationModules; import org.springframework.util.Assert; +import org.springframework.util.function.SingletonSupplier; /** * Bootstrap type to make sure we only bootstrap the initialization of a {@link ApplicationModules} instance once per @@ -43,7 +44,7 @@ public class ApplicationModulesRuntime implements Supplier { Assert.notNull(modules, "ApplicationModules must not be null!"); Assert.notNull(runtime, "ApplicationRuntime must not be null!"); - this.modules = modules; + this.modules = SingletonSupplier.of(modules); this.runtime = runtime; } diff --git a/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/ApplicationModulesRuntimeIntegrationTests.java b/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/ApplicationModulesRuntimeIntegrationTests.java index c615c4c3..fb77e0b4 100644 --- a/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/ApplicationModulesRuntimeIntegrationTests.java +++ b/spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/ApplicationModulesRuntimeIntegrationTests.java @@ -21,6 +21,7 @@ import different.moduleB.ModuleBType; import example.SampleApplication; import example.moduleA.ModuleAType; +import java.util.function.Supplier; import java.util.stream.Stream; import org.junit.jupiter.api.Test; @@ -49,4 +50,37 @@ public class ApplicationModulesRuntimeIntegrationTests { Stream.of(ModuleAType.class, ModuleBType.class) .forEach(it -> assertThat(runtime.isApplicationClass(it)).isTrue()); } + + @Test // GH-587 + void onlyLooksUpApplicationModulesOnce() { + + var context = SpringApplication.run(SampleApplication.class); + var applicationRuntime = new TestSpringBootApplicationRuntime(context); + var supplier = new CountingSupplier<>(() -> modules); + + var runtime = new ApplicationModulesRuntime(supplier, applicationRuntime); + + runtime.get(); + runtime.get(); + + assertThat(supplier.counter).isEqualTo(1); + } + + static class CountingSupplier implements Supplier { + + private final Supplier delegate; + private int counter = 0; + + CountingSupplier(Supplier delegate) { + this.delegate = delegate; + } + + @Override + public T get() { + + counter++; + + return delegate.get(); + } + } }