diff --git a/spring-modulith-events/spring-modulith-events-core/pom.xml b/spring-modulith-events/spring-modulith-events-core/pom.xml
index b7cdad20..0eb2022c 100644
--- a/spring-modulith-events/spring-modulith-events-core/pom.xml
+++ b/spring-modulith-events/spring-modulith-events-core/pom.xml
@@ -46,6 +46,12 @@
test
+
+ org.springframework
+ spring-aspects
+ test
+
+
org.springframework.boot
spring-boot-test-autoconfigure
diff --git a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationConfiguration.java b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationConfiguration.java
index 543d829b..59d89f71 100644
--- a/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationConfiguration.java
+++ b/spring-modulith-events/spring-modulith-events-core/src/main/java/org/springframework/modulith/events/config/EventPublicationConfiguration.java
@@ -24,25 +24,33 @@ import org.springframework.beans.BeansException;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanPostProcessor;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.task.TaskExecutionProperties;
import org.springframework.boot.autoconfigure.task.TaskExecutionProperties.Shutdown;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Role;
import org.springframework.core.env.Environment;
import org.springframework.modulith.events.DefaultEventPublicationRegistry;
import org.springframework.modulith.events.EventPublicationRegistry;
import org.springframework.modulith.events.EventPublicationRepository;
+import org.springframework.modulith.events.config.EventPublicationConfiguration.AsyncEnablingConfiguration;
import org.springframework.modulith.events.support.CompletionRegisteringAdvisor;
import org.springframework.modulith.events.support.PersistentApplicationEventMulticaster;
+import org.springframework.scheduling.annotation.AbstractAsyncConfiguration;
+import org.springframework.scheduling.annotation.EnableAsync;
/**
+ * Fundamental configuration for the {@link EventPublicationRegistry} support.
+ *
* @author Oliver Drotbohm
* @author Björn Kieling
* @author Dmitry Belyaev
*/
@Configuration(proxyBeanMethods = false)
+@Import(AsyncEnablingConfiguration.class)
class EventPublicationConfiguration {
@Bean
@@ -74,6 +82,10 @@ class EventPublicationConfiguration {
return new AsyncPropertiesDefaulter(environment);
}
+ @EnableAsync
+ @ConditionalOnMissingBean(AbstractAsyncConfiguration.class)
+ static class AsyncEnablingConfiguration {}
+
static class AsyncPropertiesDefaulter implements BeanPostProcessor {
private static final Logger LOGGER = LoggerFactory.getLogger(AsyncPropertiesDefaulter.class);
diff --git a/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationConfigurationIntegrationTests.java b/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationConfigurationIntegrationTests.java
index e17c76db..8bcf001e 100644
--- a/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationConfigurationIntegrationTests.java
+++ b/spring-modulith-events/spring-modulith-events-core/src/test/java/org/springframework/modulith/events/config/EventPublicationConfigurationIntegrationTests.java
@@ -31,8 +31,12 @@ import org.springframework.boot.autoconfigure.task.TaskExecutionProperties.Shutd
import org.springframework.boot.test.context.assertj.AssertableApplicationContext;
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
import org.springframework.boot.test.context.runner.ContextConsumer;
+import org.springframework.context.annotation.AdviceMode;
import org.springframework.modulith.events.EventPublicationRepository;
import org.springframework.modulith.events.config.EventPublicationConfiguration.AsyncPropertiesDefaulter;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.ProxyAsyncConfiguration;
+import org.springframework.scheduling.aspectj.AspectJAsyncConfiguration;
/**
* Unit tests for {@link EventPublicationConfiguration}.
@@ -81,6 +85,26 @@ class EventPublicationConfigurationIntegrationTests {
.run(expect(Shutdown::getAwaitTerminationPeriod, Duration.ofMinutes(10)));
}
+ @Test // GH-184
+ void enablesAsyncSupportByDefault() {
+
+ basicSetup().run(context -> {
+ assertThat(context).hasSingleBean(ProxyAsyncConfiguration.class);
+ });
+ }
+
+ @Test // GH-184
+ void doesNotEnableAsyncSupportByDefaultIfExplicitlyConfigured() {
+
+ basicSetup()
+ .withUserConfiguration(CustomAsyncConfiguration.class)
+ .run(context -> {
+ assertThat(context)
+ .doesNotHaveBean(ProxyAsyncConfiguration.class)
+ .hasSingleBean(AspectJAsyncConfiguration.class);
+ });
+ }
+
private ContextConsumer expect(Function extractor,
T expected) {
@@ -96,4 +120,7 @@ class EventPublicationConfigurationIntegrationTests {
AutoConfigurations.of(EventPublicationConfiguration.class, TaskExecutionAutoConfiguration.class))
.withBean(EventPublicationRepository.class, () -> repository);
}
+
+ @EnableAsync(mode = AdviceMode.ASPECTJ)
+ static class CustomAsyncConfiguration {}
}