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<T>".

Issue: SPR-15118
This commit is contained in:
Sebastien Deleuze 2017-01-09 20:13:23 +01:00
parent b503e4679c
commit 715274e327
2 changed files with 7 additions and 8 deletions

View File

@ -33,16 +33,16 @@ object GenericApplicationContextExtension {
/**
* @see GenericApplicationContext.registerBean(Class<T>, Supplier<T>, BeanDefinitionCustomizer...)
*/
inline fun <reified T : Any> GenericApplicationContext.registerBean(supplier: Supplier<T>,
vararg customizers: BeanDefinitionCustomizer) {
registerBean(T::class.java, supplier, *customizers)
inline fun <reified T : Any> GenericApplicationContext.registerBean(
crossinline supplier: () -> T, vararg customizers: BeanDefinitionCustomizer) {
registerBean(T::class.java, Supplier { supplier.invoke() }, *customizers)
}
/**
* @see GenericApplicationContext.registerBean(String, Class<T>, Supplier<T>, BeanDefinitionCustomizer...)
*/
inline fun <reified T : Any> GenericApplicationContext.registerBean(name: String,
supplier: Supplier<T>, 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)
}
}

View File

@ -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"))
}