Support Gradle-style Kotlin bean API

val context = GenericApplicationContext {
    registerBean<Foo>()
    registerBean { Bar(it.getBean<Foo>()) }
}

Issue: SPR-15126
This commit is contained in:
Sebastien Deleuze
2017-01-10 21:42:49 +01:00
parent 1af905ca0a
commit f8461d856a
4 changed files with 87 additions and 0 deletions

View File

@@ -23,6 +23,13 @@ object GenericApplicationContextExtension {
registerBean(beanClass.java, *customizers)
}
/**
* @see GenericApplicationContext.registerBean(Class<T>, BeanDefinitionCustomizer...)
*/
inline fun <reified T : Any> GenericApplicationContext.registerBean(vararg customizers: BeanDefinitionCustomizer) {
registerBean(T::class.java, *customizers)
}
/**
* @see GenericApplicationContext.registerBean(String, Class<T>, BeanDefinitionCustomizer...)
*/
@@ -31,6 +38,13 @@ object GenericApplicationContextExtension {
registerBean(beanName, beanClass.java, *customizers)
}
/**
* @see GenericApplicationContext.registerBean(String, Class<T>, BeanDefinitionCustomizer...)
*/
inline fun <reified T : Any> GenericApplicationContext.registerBean(beanName: String, vararg customizers: BeanDefinitionCustomizer) {
registerBean(beanName, T::class.java, *customizers)
}
/**
* @see GenericApplicationContext.registerBean(Class<T>, Supplier<T>, BeanDefinitionCustomizer...)
*/
@@ -46,4 +60,6 @@ object GenericApplicationContextExtension {
vararg customizers: BeanDefinitionCustomizer, crossinline function: (ApplicationContext) -> T) {
registerBean(name, T::class.java, Supplier { function.invoke(this) }, *customizers)
}
fun GenericApplicationContext(configure: GenericApplicationContext.()->Unit) = GenericApplicationContext().apply(configure)
}

View File

@@ -4,6 +4,7 @@ import org.junit.Assert.assertNotNull
import org.junit.Test
import org.springframework.context.support.GenericApplicationContextExtension.registerBean
import org.springframework.beans.factory.BeanFactoryExtension.getBean
import org.springframework.context.support.GenericApplicationContextExtension.GenericApplicationContext
class GenericApplicationContextExtensionTests {
@@ -59,6 +60,17 @@ class GenericApplicationContextExtensionTests {
assertNotNull(context.getBean("b"))
}
@Test
fun registerBeanWithGradleStyleApi() {
val context = GenericApplicationContext {
registerBean<BeanA>()
registerBean { BeanB(it.getBean<BeanA>()) }
}
context.refresh()
assertNotNull(context.getBean<BeanA>())
assertNotNull(context.getBean<BeanB>())
}
internal class BeanA
internal class BeanB(val a: BeanA)