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 3348da86fd8..07e1eb5da07 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 @@ -207,6 +207,13 @@ public interface BeanRegistry { */ Spec prototype(); + /** + * Configure this bean with a custom scope. + * @since 7.0.4 + * @see BeanDefinition#setScope(String) + */ + Spec scope(String scope); + /** * Set the supplier to construct a bean instance. * @see AbstractBeanDefinition#setInstanceSupplier(Supplier) 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 103c59dd2f5..47b835c5353 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 @@ -279,6 +279,12 @@ public class BeanRegistryAdapter implements BeanRegistry { return this; } + @Override + public Spec scope(String scope) { + this.beanDefinition.setScope(scope); + return this; + } + @Override public Spec supplier(Function supplier) { this.beanDefinition.setInstanceSupplier(() -> diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanRegistryAdapterTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanRegistryAdapterTests.java index c1ceba10796..84e985d08f5 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanRegistryAdapterTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/support/BeanRegistryAdapterTests.java @@ -186,6 +186,14 @@ public class BeanRegistryAdapterTests { assertThat(beanDefinition.getScope()).isEqualTo(AbstractBeanDefinition.SCOPE_PROTOTYPE); } + @Test + void customScope() { + BeanRegistryAdapter adapter = new BeanRegistryAdapter(this.beanFactory, this.beanFactory, this.env, ScopeBeanRegistrar.class); + new ScopeBeanRegistrar().register(adapter, env); + BeanDefinition beanDefinition = this.beanFactory.getBeanDefinition("foo"); + assertThat(beanDefinition.getScope()).isEqualTo("custom"); + } + @Test void defaultSupplier() { BeanRegistryAdapter adapter = new BeanRegistryAdapter(this.beanFactory, this.beanFactory, this.env, DefaultBeanRegistrar.class); @@ -308,6 +316,14 @@ public class BeanRegistryAdapterTests { } } + private static class ScopeBeanRegistrar implements BeanRegistrar { + + @Override + public void register(BeanRegistry registry, Environment env) { + registry.registerBean("foo", Foo.class, spec -> spec.scope("custom")); + } + } + private static class SupplierBeanRegistrar implements BeanRegistrar { @Override