Skip to content

Commit 08e837f

Browse files
committed
GH-375 - Avoid initialization of ApplicationModulesRuntime if possible.
1 parent 9f42ae4 commit 08e837f

File tree

2 files changed

+28
-28
lines changed

2 files changed

+28
-28
lines changed

spring-modulith-runtime/src/main/java/org/springframework/modulith/runtime/autoconfigure/SpringModulithRuntimeAutoConfiguration.java

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,13 @@
1515
*/
1616
package org.springframework.modulith.runtime.autoconfigure;
1717

18-
import java.util.concurrent.Future;
19-
import java.util.function.Supplier;
20-
2118
import org.slf4j.Logger;
2219
import org.slf4j.LoggerFactory;
2320
import org.springframework.aop.support.AopUtils;
24-
import org.springframework.beans.factory.ListableBeanFactory;
21+
import org.springframework.beans.factory.ObjectProvider;
2522
import org.springframework.beans.factory.config.BeanDefinition;
2623
import org.springframework.boot.autoconfigure.AutoConfiguration;
24+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
2725
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2826
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingClass;
2927
import org.springframework.boot.context.event.ApplicationStartedEvent;
@@ -40,6 +38,7 @@
4038
import org.springframework.modulith.runtime.ApplicationModulesRuntime;
4139
import org.springframework.modulith.runtime.ApplicationRuntime;
4240
import org.springframework.util.Assert;
41+
import org.springframework.util.function.ThrowingSupplier;
4342

4443
/**
4544
* Auto-configuration to register a {@link SpringBootApplicationRuntime}, a {@link ApplicationModulesRuntime} and an
@@ -65,23 +64,25 @@ static SpringBootApplicationRuntime modulithsApplicationRuntime(ApplicationConte
6564
@ConditionalOnMissingBean
6665
static ApplicationModulesRuntime modulesRuntime(ApplicationRuntime runtime) {
6766

68-
var mainClass = runtime.getMainApplicationClass();
69-
var modules = EXECUTOR
70-
.submit(() -> ApplicationModulesBootstrap.initializeApplicationModules(mainClass));
67+
ThrowingSupplier<ApplicationModules> modules = () -> EXECUTOR
68+
.submit(() -> ApplicationModulesBootstrap.initializeApplicationModules(runtime.getMainApplicationClass()))
69+
.get();
7170

72-
return new ApplicationModulesRuntime(toSupplier(modules), runtime);
71+
return new ApplicationModulesRuntime(modules, runtime);
7372
}
7473

7574
@Bean
7675
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
76+
@ConditionalOnBean(ApplicationModuleInitializer.class)
7777
static ApplicationListener<ApplicationStartedEvent> applicationModuleInitializingListener(
78-
ListableBeanFactory beanFactory) {
78+
ObjectProvider<ApplicationModulesRuntime> runtime,
79+
ObjectProvider<ApplicationModuleInitializer> initializers) {
7980

8081
return event -> {
8182

82-
var modules = beanFactory.getBean(ApplicationModulesRuntime.class).get();
83+
var modules = runtime.getObject().get();
8384

84-
beanFactory.getBeanProvider(ApplicationModuleInitializer.class).stream() //
85+
initializers.stream() //
8586
.sorted(modules.getComparator()) //
8687
.map(it -> LOGGER.isDebugEnabled() ? new LoggingApplicationModuleInitializerAdapter(it, modules) : it)
8788
.forEach(ApplicationModuleInitializer::initialize);
@@ -160,17 +161,6 @@ static ApplicationModules initializeApplicationModules(Class<?> applicationMainC
160161
}
161162
}
162163

163-
private static Supplier<ApplicationModules> toSupplier(Future<ApplicationModules> modules) {
164-
165-
return () -> {
166-
try {
167-
return modules.get();
168-
} catch (Exception o_O) {
169-
throw new RuntimeException(o_O);
170-
}
171-
};
172-
}
173-
174164
/**
175165
* Auto-configuration to react to ArchUnit missing on the runtime classpath.
176166
*

spring-modulith-runtime/src/test/java/org/springframework/modulith/runtime/autoconfigure/SpringModulithRuntimeAutoConfigurationIntegrationTests.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.springframework.boot.autoconfigure.SpringBootApplication;
2424
import org.springframework.boot.test.context.FilteredClassLoader;
2525
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
26+
import org.springframework.modulith.ApplicationModuleInitializer;
2627
import org.springframework.modulith.runtime.ApplicationModulesRuntime;
2728
import org.springframework.modulith.runtime.ApplicationRuntime;
2829

@@ -46,11 +47,8 @@ void bootstrapRegistersRuntimeInstances() {
4647
.withUserConfiguration(SampleApp.class)
4748
.withConfiguration(AutoConfigurations.of(SpringModulithRuntimeAutoConfiguration.class))
4849
.run(context -> {
49-
5050
assertThat(context.getBean(ApplicationRuntime.class)).isNotNull();
5151
assertThat(context.getBean(ApplicationModulesRuntime.class)).isNotNull();
52-
53-
context.close();
5452
});
5553
}
5654

@@ -62,13 +60,25 @@ void missingArchUnitRuntimeDependencyEscalatesOnContextStartup() {
6260
.withConfiguration(AutoConfigurations.of(SpringModulithRuntimeAutoConfiguration.class))
6361
.withClassLoader(new FilteredClassLoader(ClassFileImporter.class))
6462
.run(context -> {
65-
6663
assertThat(context).hasFailed();
6764
assertThat(context.getStartupFailure().getCause())
6865
.isInstanceOf(BeanInstantiationException.class)
6966
.cause().isInstanceOf(MissingRuntimeDependency.class);
70-
71-
context.close();
7267
});
7368
}
69+
70+
@Test // GH-375
71+
void registersInitializingListenerIfInitializersPresent() {
72+
73+
var beanName = "applicationModuleInitializingListener";
74+
var runner = new ApplicationContextRunner()
75+
.withConfiguration(AutoConfigurations.of(SpringModulithRuntimeAutoConfiguration.class));
76+
77+
// No initializer -> no listener
78+
runner.run(context -> assertThat(context).doesNotHaveBean(beanName));
79+
80+
// Initializer -> listener
81+
runner.withBean(ApplicationModuleInitializer.class, () -> () -> {})
82+
.run(context -> assertThat(context).hasBean(beanName));
83+
}
7484
}

0 commit comments

Comments
 (0)