From 2bc213d703b1cfb02ed0bc913dea3d4f0b90dfec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Deleuze?= Date: Wed, 19 Mar 2025 15:07:54 +0100 Subject: [PATCH] Allow registering aliases with BeanRegistry Closes gh-34599 --- .../springframework/beans/factory/BeanRegistry.java | 9 +++++++++ .../beans/factory/support/BeanRegistryAdapter.java | 5 +++++ .../springframework/beans/factory/BeanRegistrarDsl.kt | 11 +++++++++++ .../BeanRegistrarConfigurationTests.java | 1 + .../annotation/BeanRegistrarDslConfigurationTests.kt | 4 +++- .../beans/factory/SampleBeanRegistrar.java | 1 + 6 files changed, 30 insertions(+), 1 deletion(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/BeanRegistry.java b/spring-beans/src/main/java/org/springframework/beans/factory/BeanRegistry.java index 28abbb26626..7a53d29eca3 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/BeanRegistry.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/BeanRegistry.java @@ -38,6 +38,15 @@ import org.springframework.core.env.Environment; */ public interface BeanRegistry { + /** + * Given a name, register an alias for it. + * @param name the canonical name + * @param alias the alias to be registered + * @throws IllegalStateException if the alias is already in use + * and may not be overridden + */ + void registerAlias(String name, String alias); + /** * Register a bean from the given bean class, which will be instantiated * using the related {@link BeanUtils#getResolvableConstructor resolvable constructor} diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanRegistryAdapter.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanRegistryAdapter.java index 30533668365..e3c0ad363b1 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanRegistryAdapter.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/BeanRegistryAdapter.java @@ -80,6 +80,11 @@ public class BeanRegistryAdapter implements BeanRegistry { } + @Override + public void registerAlias(String name, String alias) { + this.beanRegistry.registerAlias(name, alias); + } + @Override public String registerBean(Class beanClass) { String beanName = BeanDefinitionReaderUtils.uniqueBeanName(beanClass.getName(), this.beanRegistry); diff --git a/spring-beans/src/main/kotlin/org/springframework/beans/factory/BeanRegistrarDsl.kt b/spring-beans/src/main/kotlin/org/springframework/beans/factory/BeanRegistrarDsl.kt index 665ee6da2f1..9aa38e8b2ae 100644 --- a/spring-beans/src/main/kotlin/org/springframework/beans/factory/BeanRegistrarDsl.kt +++ b/spring-beans/src/main/kotlin/org/springframework/beans/factory/BeanRegistrarDsl.kt @@ -64,6 +64,17 @@ open class BeanRegistrarDsl(private val init: BeanRegistrarDsl.() -> Unit): Bean */ lateinit var env: Environment + /** + * Given a name, register an alias for it. + * @param name the canonical name + * @param alias the alias to be registered + * @throws IllegalStateException if the alias is already in use + * and may not be overridden + */ + fun registerAlias(name: String, alias: String) { + registry.registerAlias(name, alias); + } + /** * Register a bean from the given bean class, which will be instantiated * using the related [resolvable constructor] diff --git a/spring-context/src/test/java/org/springframework/context/annotation/beanregistrar/BeanRegistrarConfigurationTests.java b/spring-context/src/test/java/org/springframework/context/annotation/beanregistrar/BeanRegistrarConfigurationTests.java index d002c4ef6de..46c9118b681 100644 --- a/spring-context/src/test/java/org/springframework/context/annotation/beanregistrar/BeanRegistrarConfigurationTests.java +++ b/spring-context/src/test/java/org/springframework/context/annotation/beanregistrar/BeanRegistrarConfigurationTests.java @@ -45,6 +45,7 @@ public class BeanRegistrarConfigurationTests { void beanRegistrar() { AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(BeanRegistrarConfiguration.class); assertThat(context.getBean(Bar.class).foo()).isEqualTo(context.getBean(Foo.class)); + assertThat(context.getBean("foo", Foo.class)).isEqualTo(context.getBean("fooAlias", Foo.class)); assertThatThrownBy(() -> context.getBean(Baz.class)).isInstanceOf(NoSuchBeanDefinitionException.class); assertThat(context.getBean(Init.class).initialized).isTrue(); BeanDefinition beanDefinition = context.getBeanDefinition("bar"); diff --git a/spring-context/src/test/kotlin/org/springframework/context/annotation/BeanRegistrarDslConfigurationTests.kt b/spring-context/src/test/kotlin/org/springframework/context/annotation/BeanRegistrarDslConfigurationTests.kt index 39faddebf32..a3558bca340 100644 --- a/spring-context/src/test/kotlin/org/springframework/context/annotation/BeanRegistrarDslConfigurationTests.kt +++ b/spring-context/src/test/kotlin/org/springframework/context/annotation/BeanRegistrarDslConfigurationTests.kt @@ -39,6 +39,7 @@ class BeanRegistrarDslConfigurationTests { fun beanRegistrar() { val context = AnnotationConfigApplicationContext(BeanRegistrarKotlinConfiguration::class.java) assertThat(context.getBean().foo).isEqualTo(context.getBean()) + assertThat(context.getBean("foo")).isEqualTo(context.getBean("fooAlias")) assertThatThrownBy(ThrowableAssert.ThrowingCallable { context.getBean() }).isInstanceOf(NoSuchBeanDefinitionException::class.java) assertThat(context.getBean().initialized).isTrue() val beanDefinition = context.getBeanDefinition("bar") @@ -88,7 +89,8 @@ class BeanRegistrarDslConfigurationTests { internal class BeanRegistrarKotlinConfiguration private class SampleBeanRegistrar : BeanRegistrarDsl({ - registerBean() + registerBean("foo") + registerAlias("foo", "fooAlias") registerBean( name = "bar", prototype = true, diff --git a/spring-context/src/testFixtures/java/org/springframework/context/testfixture/beans/factory/SampleBeanRegistrar.java b/spring-context/src/testFixtures/java/org/springframework/context/testfixture/beans/factory/SampleBeanRegistrar.java index 26115c7d77e..e29db751321 100644 --- a/spring-context/src/testFixtures/java/org/springframework/context/testfixture/beans/factory/SampleBeanRegistrar.java +++ b/spring-context/src/testFixtures/java/org/springframework/context/testfixture/beans/factory/SampleBeanRegistrar.java @@ -27,6 +27,7 @@ public class SampleBeanRegistrar implements BeanRegistrar { @Override public void register(BeanRegistry registry, Environment env) { registry.registerBean("foo", Foo.class); + registry.registerAlias("foo", "fooAlias"); registry.registerBean("bar", Bar.class, spec -> spec .prototype() .lazyInit()