Skip to content

Commit 8144afa

Browse files
committed
GH-610 - Avoid repeated lookup of ApplicationModules in ApplicationModulesRuntime.
1 parent 2c1b2aa commit 8144afa

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/ApplicationModulesRuntime.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919

2020
import org.springframework.modulith.core.ApplicationModules;
2121
import org.springframework.util.Assert;
22+
import org.springframework.util.function.SingletonSupplier;
2223

2324
/**
2425
* Bootstrap type to make sure we only bootstrap the initialization of a {@link ApplicationModules} instance once per
@@ -43,7 +44,7 @@ public ApplicationModulesRuntime(Supplier<ApplicationModules> modules, Applicati
4344
Assert.notNull(modules, "ApplicationModules must not be null!");
4445
Assert.notNull(runtime, "ApplicationRuntime must not be null!");
4546

46-
this.modules = modules;
47+
this.modules = SingletonSupplier.of(modules);
4748
this.runtime = runtime;
4849
}
4950

spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/ApplicationModulesRuntimeIntegrationTests.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import example.SampleApplication;
2222
import example.moduleA.ModuleAType;
2323

24+
import java.util.function.Supplier;
2425
import java.util.stream.Stream;
2526

2627
import org.junit.jupiter.api.Test;
@@ -49,4 +50,37 @@ void detectsTypeInAdditionalPackageAsApplicationType() {
4950
Stream.of(ModuleAType.class, ModuleBType.class)
5051
.forEach(it -> assertThat(runtime.isApplicationClass(it)).isTrue());
5152
}
53+
54+
@Test // GH-610
55+
void onlyLooksUpApplicationModulesOnce() {
56+
57+
var context = SpringApplication.run(SampleApplication.class);
58+
var applicationRuntime = new TestSpringBootApplicationRuntime(context);
59+
var supplier = new CountingSupplier<>(() -> modules);
60+
61+
var runtime = new ApplicationModulesRuntime(supplier, applicationRuntime);
62+
63+
runtime.get();
64+
runtime.get();
65+
66+
assertThat(supplier.counter).isEqualTo(1);
67+
}
68+
69+
static class CountingSupplier<T> implements Supplier<T> {
70+
71+
private final Supplier<T> delegate;
72+
private int counter = 0;
73+
74+
CountingSupplier(Supplier<T> delegate) {
75+
this.delegate = delegate;
76+
}
77+
78+
@Override
79+
public T get() {
80+
81+
counter++;
82+
83+
return delegate.get();
84+
}
85+
}
5286
}

0 commit comments

Comments
 (0)