From 4cf9b5c7072e9e88f1c0897f9f7d8bf703c0fdae Mon Sep 17 00:00:00 2001 From: Oliver Drotbohm Date: Fri, 18 Apr 2025 00:01:55 +0200 Subject: [PATCH] GH-1149 - Optimize performance for application module lookups by type. We now avoid immediately resorting to a by type name lookup that triggers extensive search to be able to support simple class names. --- .../springframework/modulith/core/ApplicationModule.java | 4 ++-- .../springframework/modulith/core/ApplicationModules.java | 5 ++++- .../java/org/springframework/modulith/core/Classes.java | 6 +++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModule.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModule.java index 678473f7..621feaed 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModule.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModule.java @@ -341,7 +341,7 @@ public class ApplicationModule implements Comparable { * @param type must not be {@literal null}. */ public boolean contains(JavaClass type) { - return contains(type.getName()); + return classes.contains(type); } /** @@ -350,7 +350,7 @@ public class ApplicationModule implements Comparable { * @param type must not be {@literal null}. */ public boolean contains(Class type) { - return contains(type.getName()); + return classes.contains(type); } /** diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java index 2f3ed13e..d9e55a77 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/ApplicationModules.java @@ -412,7 +412,10 @@ public class ApplicationModules implements Iterable { * @return will never be {@literal null}. */ public Optional getModuleByType(Class candidate) { - return getModuleByType(candidate.getName()); + + return allModules() + .filter(it -> it.contains(candidate)) + .findFirst(); } /** diff --git a/spring-modulith-core/src/main/java/org/springframework/modulith/core/Classes.java b/spring-modulith-core/src/main/java/org/springframework/modulith/core/Classes.java index 16eb52c0..6d3bf3ef 100644 --- a/spring-modulith-core/src/main/java/org/springframework/modulith/core/Classes.java +++ b/spring-modulith-core/src/main/java/org/springframework/modulith/core/Classes.java @@ -172,7 +172,11 @@ class Classes implements DescribedIterable { } boolean contains(JavaClass type) { - return !that(new SameClass(type)).isEmpty(); + return classes.contains(type); + } + + boolean contains(Class type) { + return classes.stream().anyMatch(it -> it.isEquivalentTo(type)); } boolean contains(String className) {