Support noarg callable references in Kotlin beans DSL

Closes gh-23395
This commit is contained in:
Sébastien Deleuze 2020-01-13 10:51:19 +01:00
parent 0801a7d7e4
commit 3f1882c4eb
2 changed files with 39 additions and 1 deletions

View File

@ -236,6 +236,42 @@ open class BeanDefinitionDsl internal constructor (private val init: BeanDefinit
context.registerBean(beanName, T::class.java, Supplier { function.invoke(BeanSupplierContext(context)) }, customizer)
}
/**
* Declare a bean definition using the given callable reference with no parameter
* for obtaining a new instance.
*
* @param f the callable reference
* @param name the name of the bean
* @param scope Override the target scope of this bean, specifying a new scope name.
* @param isLazyInit Set whether this bean should be lazily initialized.
* @param isPrimary Set whether this bean is a primary autowire candidate.
* @param isAutowireCandidate Set whether this bean is a candidate for getting
* autowired into some other bean.
* @param initMethodName Set the name of the initializer method
* @param destroyMethodName Set the name of the destroy method
* @param description Set a human-readable description of this bean definition
* @param role Set the role hint for this bean definition
* @see GenericApplicationContext.registerBean
* @see org.springframework.beans.factory.config.BeanDefinition
* @since 5.2.3
*/
inline fun <reified T: Any>
bean(crossinline f: () -> T,
name: String? = null,
scope: BeanDefinitionDsl.Scope? = null,
isLazyInit: Boolean? = null,
isPrimary: Boolean? = null,
isAutowireCandidate: Boolean? = null,
initMethodName: String? = null,
destroyMethodName: String? = null,
description: String? = null,
role: BeanDefinitionDsl.Role? = null) {
bean(name, scope, isLazyInit, isPrimary, isAutowireCandidate, initMethodName, destroyMethodName, description, role) {
f.invoke()
}
}
/**
* Declare a bean definition using the given callable reference with 1 parameter
* autowired by type for obtaining a new instance.

View File

@ -1,5 +1,5 @@
/*
* Copyright 2002-2019 the original author or authors.
* Copyright 2002-2020 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@ -156,6 +156,7 @@ class BeanDefinitionDslTests {
val beans = beans {
bean<Bar>()
bean(::baz)
bean(::foo)
}
val context = GenericApplicationContext().apply {
beans.initialize(this)
@ -205,3 +206,4 @@ class FooFoo(val name: String)
class BarBar(val foos: Collection<Foo>)
fun baz(bar: Bar) = Baz(bar)
fun foo() = Foo()