-
Notifications
You must be signed in to change notification settings - Fork 38.9k
Closed
Labels
in: coreIssues in core modules (aop, beans, core, context, expression)Issues in core modules (aop, beans, core, context, expression)type: enhancementA general enhancementA general enhancement
Milestone
Description
Sébastien Deleuze opened SPR-17648 and commented
Current Kotlin bean DSL makes it possible to shoot yourself in the foot easily by allowing to write:
beans {
val bar = ref<Bar>()
bean<Foo> { Foo(bar)}
}Which will trigger java.lang.IllegalStateException: org.springframework.context.support.GenericApplicationContext@2c532cd8 has not been refreshed yet.
We should only expose ref() and provider() in the supplier responsible for providing the bean, since it will be call at the right time of the lifecycle.
We could maybe introduce some kind of BeanDefinitionContext:
open class BeanDefinitionContext(@PublishedApi internal val context: GenericApplicationContext) {
inline fun <reified T : Any> ref(name: String? = null): T = when (name) {
null -> context.getBean(T::class.java)
else -> context.getBean(name, T::class.java)
}
inline fun <reified T : Any> provider() : ObjectProvider<T> = context.getBeanProvider()
}And change crossinline function: () -> T to crossinline function: BeanDefinitionContext.() -> T in the bean supplier variant.
Additional notes:
- We should maybe use this opportunity to provide direct access to
ObjectProvidermethods, exposeSequenceinstead ofStream, etc. - We should maybe think about providing a
router()variant that leverages thisBeanDefinitionContextsince this is a common use case.
No further details from SPR-17648
Metadata
Metadata
Assignees
Labels
in: coreIssues in core modules (aop, beans, core, context, expression)Issues in core modules (aop, beans, core, context, expression)type: enhancementA general enhancementA general enhancement