From 715274e327fe8ec72479f96b2e922a0e63f02ceb Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Mon, 9 Jan 2017 20:13:23 +0100 Subject: [PATCH] Avoid the need to specify Supplier in Kotlin bean registration API Based on an idea from Mario Arias, we can avoid requiring specifying explicitly Supplier lambda type in Kotlin API by declaring the supplier parameter as "crossinline supplier: () -> T" instead of "supplier: Supplier". Issue: SPR-15118 --- .../support/GenericApplicationContextExtension.kt | 10 +++++----- .../support/GenericApplicationContextExtensionTests.kt | 5 ++--- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/spring-context/src/main/kotlin/org/springframework/context/support/GenericApplicationContextExtension.kt b/spring-context/src/main/kotlin/org/springframework/context/support/GenericApplicationContextExtension.kt index 27040417a46..7e57d99c0be 100644 --- a/spring-context/src/main/kotlin/org/springframework/context/support/GenericApplicationContextExtension.kt +++ b/spring-context/src/main/kotlin/org/springframework/context/support/GenericApplicationContextExtension.kt @@ -33,16 +33,16 @@ object GenericApplicationContextExtension { /** * @see GenericApplicationContext.registerBean(Class, Supplier, BeanDefinitionCustomizer...) */ - inline fun GenericApplicationContext.registerBean(supplier: Supplier, - vararg customizers: BeanDefinitionCustomizer) { - registerBean(T::class.java, supplier, *customizers) + inline fun GenericApplicationContext.registerBean( + crossinline supplier: () -> T, vararg customizers: BeanDefinitionCustomizer) { + registerBean(T::class.java, Supplier { supplier.invoke() }, *customizers) } /** * @see GenericApplicationContext.registerBean(String, Class, Supplier, BeanDefinitionCustomizer...) */ inline fun GenericApplicationContext.registerBean(name: String, - supplier: Supplier, vararg customizers: BeanDefinitionCustomizer) { - registerBean(name, T::class.java, supplier, *customizers) + crossinline supplier: () -> T, vararg customizers: BeanDefinitionCustomizer) { + registerBean(name, T::class.java, Supplier { supplier.invoke() }, *customizers) } } diff --git a/spring-context/src/test/kotlin/org/springframework/context/support/GenericApplicationContextExtensionTests.kt b/spring-context/src/test/kotlin/org/springframework/context/support/GenericApplicationContextExtensionTests.kt index f707d204fd5..4b4a4c5d574 100644 --- a/spring-context/src/test/kotlin/org/springframework/context/support/GenericApplicationContextExtensionTests.kt +++ b/spring-context/src/test/kotlin/org/springframework/context/support/GenericApplicationContextExtensionTests.kt @@ -4,7 +4,6 @@ import org.junit.Assert.assertNotNull import org.junit.Test import org.springframework.context.support.GenericApplicationContextExtension.registerBean import org.springframework.beans.factory.BeanFactoryExtension.getBean -import java.util.function.Supplier class GenericApplicationContextExtensionTests { @@ -27,7 +26,7 @@ class GenericApplicationContextExtensionTests { @Test fun registerBeanWithSupplier() { val context = GenericApplicationContext() - context.registerBean(Supplier { BeanA() }) + context.registerBean({ BeanA() }) context.refresh() assertNotNull(context.getBean(BeanA::class)) } @@ -35,7 +34,7 @@ class GenericApplicationContextExtensionTests { @Test fun registerBeanWithNameAndSupplier() { val context = GenericApplicationContext() - context.registerBean("a", Supplier { BeanA() }) + context.registerBean("a", { BeanA() }) context.refresh() assertNotNull(context.getBean("a")) }