diff --git a/spring-context/src/main/kotlin/org/springframework/context/support/BeanDefinitionDsl.kt b/spring-context/src/main/kotlin/org/springframework/context/support/BeanDefinitionDsl.kt index fe7826e424f414359a4ebdb493088db8802cccc3..31b02554129652cd4b9448215dabb49970b198c5 100644 --- a/spring-context/src/main/kotlin/org/springframework/context/support/BeanDefinitionDsl.kt +++ b/spring-context/src/main/kotlin/org/springframework/context/support/BeanDefinitionDsl.kt @@ -16,8 +16,10 @@ package org.springframework.context.support +import org.springframework.beans.factory.ObjectProvider import org.springframework.beans.factory.config.BeanDefinition import org.springframework.beans.factory.config.BeanDefinitionCustomizer +import org.springframework.beans.factory.getBeanProvider import org.springframework.beans.factory.support.BeanDefinitionReaderUtils import org.springframework.context.ApplicationContextInitializer import org.springframework.core.env.ConfigurableEnvironment @@ -81,10 +83,10 @@ open class BeanDefinitionDsl(private val init: BeanDefinitionDsl.() -> Unit, internal val children = arrayListOf() /** - * Access to the context for advanced use-cases. - * @since 5.1 + * @see provider */ - lateinit var context: GenericApplicationContext + @PublishedApi + internal lateinit var context: GenericApplicationContext /** * Shortcut for `context.environment` @@ -245,6 +247,15 @@ open class BeanDefinitionDsl(private val init: BeanDefinitionDsl.() -> Unit, else -> context.getBean(name, T::class.java) } + + /** + * Return an provider for the specified bean, allowing for lazy on-demand retrieval + * of instances, including availability and uniqueness options. + * @since 5.1.1 + * @see org.springframework.beans.factory.BeanFactory.getBeanProvider + */ + inline fun provider() : ObjectProvider = context.getBeanProvider() + /** * Take in account bean definitions enclosed in the provided lambda only when the * specified profile is active. diff --git a/spring-context/src/test/kotlin/org/springframework/context/support/BeanDefinitionDslTests.kt b/spring-context/src/test/kotlin/org/springframework/context/support/BeanDefinitionDslTests.kt index 794e55576a9a4e3e2f7389f5993c8a29808011b6..d69e069cd534ac4a9a044c25a4877ea3ebe7466e 100644 --- a/spring-context/src/test/kotlin/org/springframework/context/support/BeanDefinitionDslTests.kt +++ b/spring-context/src/test/kotlin/org/springframework/context/support/BeanDefinitionDslTests.kt @@ -20,11 +20,11 @@ import org.junit.Assert.* import org.junit.Test import org.springframework.beans.factory.NoSuchBeanDefinitionException import org.springframework.beans.factory.getBean -import org.springframework.beans.factory.getBeansOfType import org.springframework.context.support.BeanDefinitionDsl.* import org.springframework.core.env.SimpleCommandLinePropertySource import org.springframework.core.env.get import org.springframework.mock.env.MockPropertySource +import java.util.stream.Collectors @Suppress("UNUSED_EXPRESSION") class BeanDefinitionDslTests { @@ -127,12 +127,12 @@ class BeanDefinitionDslTests { } } - @Test // SPR-16269 - fun `Provide access to the context for allowing calling advanced features like getBeansOfType`() { + @Test // SPR-17352 + fun `Retrieve multiple beans via a bean provider`() { val beans = beans { bean() bean() - bean { BarBar(context.getBeansOfType().values) } + bean { BarBar(provider().stream().collect(Collectors.toList())) } } val context = GenericApplicationContext().apply {