diff --git a/spring-modulith-core/pom.xml b/spring-modulith-core/pom.xml index 040b45e6..821ea3a2 100644 --- a/spring-modulith-core/pom.xml +++ b/spring-modulith-core/pom.xml @@ -40,6 +40,11 @@ org.springframework spring-core + + + org.springframework + spring-context + org.springframework.boot @@ -73,12 +78,6 @@ true - - org.springframework - spring-context - test - - org.springframework spring-tx diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java index 338f2d72..d14caa64 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ModulithMetadata.java @@ -18,12 +18,17 @@ package org.springframework.modulith.core; import java.util.List; import java.util.Optional; import java.util.function.Supplier; +import java.util.Set; import java.util.stream.Stream; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider; +import org.springframework.core.type.filter.AnnotationTypeFilter; import org.springframework.modulith.Modulith; import org.springframework.modulith.Modulithic; import org.springframework.modulith.core.Types.SpringTypes; import org.springframework.util.Assert; +import org.springframework.util.ClassUtils; /** * Core metadata about the modulithic application. @@ -56,13 +61,26 @@ public interface ModulithMetadata { } /** - * Creates a new {@link ModulithMetadata} instance for the given package. + * Creates a new {@link ModulithMetadata} instance for the given package. Inspects the package for classes annotated + * with {@link Modulithic} to pick up additional configuration. * * @param javaPackage must not be {@literal null} or empty. * @return will never be {@literal null}. */ public static ModulithMetadata of(String javaPackage) { - return SpringBootModulithMetadata.of(javaPackage); + + var provider = new ClassPathScanningCandidateComponentProvider(false); + provider.addIncludeFilter(new AnnotationTypeFilter(Modulithic.class)); + + Set candidates = provider.findCandidateComponents(javaPackage); + + if (candidates.size() != 1) { + return SpringBootModulithMetadata.of(javaPackage); + } + + var className = candidates.iterator().next().getBeanClassName(); + + return of(ClassUtils.resolveClassName(className, ModulithMetadata.class.getClassLoader())); } /** diff --git a/spring-modulith-core/src/test/java/empty/EmptyApplication.java b/spring-modulith-core/src/test/java/empty/EmptyApplication.java index 54146492..f8b4d3d6 100644 --- a/spring-modulith-core/src/test/java/empty/EmptyApplication.java +++ b/spring-modulith-core/src/test/java/empty/EmptyApplication.java @@ -20,5 +20,5 @@ import org.springframework.modulith.Modulithic; /** * @author Oliver Drotbohm */ -@Modulithic +@Modulithic(systemName = "customSystemName") public class EmptyApplication {} diff --git a/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java b/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java index 8c31c076..1a844acc 100644 --- a/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java +++ b/spring-modulith-core/src/test/java/org/springframework/modulith/core/ModulithMetadataUnitTest.java @@ -74,6 +74,14 @@ class ModulithMetadataUnitTest { assertThat(metadata.getBasePackages()).containsExactly(getClass().getPackageName()); } + @Test // GH-1015 + void considersModulithicOnPackageLookup() { + + var metadata = ModulithMetadata.of("empty"); + + assertThat(metadata.getSystemName()).hasValue("customSystemName"); + } + @Modulith(additionalPackages = "com.acme.foo", // sharedModules = "shared.module", // systemName = "systemName", //