From fb4ad2f3ba0bf0d968a49a05efd8fd41f3e2509d Mon Sep 17 00:00:00 2001 From: bnbakp0582 <126920224+bnbakp0582@users.noreply.github.com> Date: Sat, 8 Jul 2023 22:02:38 +0800 Subject: [PATCH 1/3] Simplify DefaultSingletonBeanRegistry.isDependent() Move `alreadySeen` handling out of for-loop. Closes gh-30839 --- .../factory/support/DefaultSingletonBeanRegistry.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java index 98ca29c7a43..b201fc5a629 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java @@ -453,11 +453,11 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements if (dependentBeans.contains(dependentBeanName)) { return true; } + if (alreadySeen == null) { + alreadySeen = new HashSet<>(); + } + alreadySeen.add(beanName); for (String transitiveDependency : dependentBeans) { - if (alreadySeen == null) { - alreadySeen = new HashSet<>(); - } - alreadySeen.add(beanName); if (isDependent(transitiveDependency, dependentBeanName, alreadySeen)) { return true; } From 502997d8e986dcfde1f49b2b2f443a32b5488b13 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sun, 9 Jul 2023 15:31:41 +0200 Subject: [PATCH 2/3] Further simplify DefaultSingletonBeanRegistry.isDependent() See gh-30839 --- .../beans/factory/support/DefaultSingletonBeanRegistry.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java index b201fc5a629..9b189b34312 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistry.java @@ -447,7 +447,7 @@ public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements } String canonicalName = canonicalName(beanName); Set dependentBeans = this.dependentBeanMap.get(canonicalName); - if (dependentBeans == null) { + if (dependentBeans == null || dependentBeans.isEmpty()) { return false; } if (dependentBeans.contains(dependentBeanName)) { From b32b4f3a597815a05f048aeedc0ce404c016dc37 Mon Sep 17 00:00:00 2001 From: Sam Brannen Date: Sun, 9 Jul 2023 15:28:05 +0200 Subject: [PATCH 3/3] Polish DefaultSingletonBeanRegistryTests --- .../DefaultSingletonBeanRegistryTests.java | 32 +++++++------------ 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistryTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistryTests.java index 47a476b3d81..b114ac3ae7a 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistryTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/support/DefaultSingletonBeanRegistryTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2022 the original author or authors. + * Copyright 2002-2023 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -28,12 +28,13 @@ import static org.assertj.core.api.Assertions.assertThat; * @author Chris Beams * @since 04.07.2006 */ -public class DefaultSingletonBeanRegistryTests { +class DefaultSingletonBeanRegistryTests { + + private final DefaultSingletonBeanRegistry beanRegistry = new DefaultSingletonBeanRegistry(); - @Test - public void testSingletons() { - DefaultSingletonBeanRegistry beanRegistry = new DefaultSingletonBeanRegistry(); + @Test + void singletons() { TestBean tb = new TestBean(); beanRegistry.registerSingleton("tb", tb); assertThat(beanRegistry.getSingleton("tb")).isSameAs(tb); @@ -44,20 +45,15 @@ public class DefaultSingletonBeanRegistryTests { assertThat(beanRegistry.getSingleton("tb")).isSameAs(tb); assertThat(beanRegistry.getSingleton("tb2")).isSameAs(tb2); assertThat(beanRegistry.getSingletonCount()).isEqualTo(2); - String[] names = beanRegistry.getSingletonNames(); - assertThat(names).hasSize(2); - assertThat(names[0]).isEqualTo("tb"); - assertThat(names[1]).isEqualTo("tb2"); + assertThat(beanRegistry.getSingletonNames()).containsExactly("tb", "tb2"); beanRegistry.destroySingletons(); - assertThat(beanRegistry.getSingletonCount()).isEqualTo(0); + assertThat(beanRegistry.getSingletonCount()).isZero(); assertThat(beanRegistry.getSingletonNames()).isEmpty(); } @Test - public void testDisposableBean() { - DefaultSingletonBeanRegistry beanRegistry = new DefaultSingletonBeanRegistry(); - + void disposableBean() { DerivedTestBean tb = new DerivedTestBean(); beanRegistry.registerSingleton("tb", tb); beanRegistry.registerDisposableBean("tb", tb); @@ -65,21 +61,17 @@ public class DefaultSingletonBeanRegistryTests { assertThat(beanRegistry.getSingleton("tb")).isSameAs(tb); assertThat(beanRegistry.getSingletonCount()).isEqualTo(1); - String[] names = beanRegistry.getSingletonNames(); - assertThat(names).hasSize(1); - assertThat(names[0]).isEqualTo("tb"); + assertThat(beanRegistry.getSingletonNames()).containsExactly("tb"); assertThat(tb.wasDestroyed()).isFalse(); beanRegistry.destroySingletons(); - assertThat(beanRegistry.getSingletonCount()).isEqualTo(0); + assertThat(beanRegistry.getSingletonCount()).isZero(); assertThat(beanRegistry.getSingletonNames()).isEmpty(); assertThat(tb.wasDestroyed()).isTrue(); } @Test - public void testDependentRegistration() { - DefaultSingletonBeanRegistry beanRegistry = new DefaultSingletonBeanRegistry(); - + void dependentRegistration() { beanRegistry.registerDependentBean("a", "b"); beanRegistry.registerDependentBean("b", "c"); beanRegistry.registerDependentBean("c", "b");