From 0cececae5d44dd6f6278d8cd3b1363b4033c9520 Mon Sep 17 00:00:00 2001 From: Junggi Kim Date: Fri, 11 Sep 2026 15:06:08 +0900 Subject: [PATCH] Use a LinkedHashSet when merging parent bean names BeanFactoryUtils.mergeNamesWithParent() built its result in an ArrayList and called contains() on it for every name returned by the parent factory. A call that finds no match walks the whole list, so merging m parent names into n local names is O(n*m + m^2) string comparisons. The list is only ever used as an ordered set: names are appended, never read by index, and contains() only rejects duplicates. beansOfTypeIncludingAncestors() already applies the same shadowing rule with a LinkedHashMap. Declaring merged as a LinkedHashSet does the same thing here and makes the membership check a hash lookup. The method is only called when the factory has a parent ListableBeanFactory. Signed-off-by: Junggi Kim --- .../beans/factory/BeanFactoryUtils.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactoryUtils.java b/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactoryUtils.java index 9969116c1857..4c7a6de860aa 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactoryUtils.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/BeanFactoryUtils.java @@ -17,11 +17,10 @@ package org.springframework.beans.factory; import java.lang.annotation.Annotation; -import java.util.ArrayList; -import java.util.Arrays; +import java.util.Collections; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.jspecify.annotations.Nullable; @@ -29,6 +28,7 @@ import org.springframework.beans.BeansException; import org.springframework.core.ResolvableType; import org.springframework.util.Assert; +import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; /** @@ -522,8 +522,8 @@ private static String[] mergeNamesWithParent(String[] result, String[] parentRes if (parentResult.length == 0) { return result; } - List merged = new ArrayList<>(result.length + parentResult.length); - merged.addAll(Arrays.asList(result)); + Set merged = CollectionUtils.newLinkedHashSet(result.length + parentResult.length); + Collections.addAll(merged, result); for (String beanName : parentResult) { if (!merged.contains(beanName) && !hbf.containsLocalBean(beanName)) { merged.add(beanName);