Add Kotlin extensions for bean registration and retrieval
Issue: SPR-15048
This commit is contained in:
parent
a8741dd371
commit
ff675f5226
15
build.gradle
15
build.gradle
|
|
@ -326,7 +326,7 @@ project("spring-build-src") {
|
|||
project("spring-core") {
|
||||
description = "Spring Core"
|
||||
|
||||
// Kotlin compiler does not support JDK 9 yet
|
||||
// Kotlin compiler does not support JDK 9 yet, see https://youtrack.jetbrains.com/issue/KT-14988
|
||||
if (!JavaVersion.current().java9Compatible) {
|
||||
apply plugin: "kotlin"
|
||||
}
|
||||
|
|
@ -430,7 +430,7 @@ project("spring-core") {
|
|||
project("spring-beans") {
|
||||
description = "Spring Beans"
|
||||
|
||||
// Kotlin compiler does not support JDK 9 yet
|
||||
// Kotlin compiler does not support JDK 9 yet, see https://youtrack.jetbrains.com/issue/KT-14988
|
||||
if (!JavaVersion.current().java9Compatible) {
|
||||
apply plugin: "kotlin"
|
||||
}
|
||||
|
|
@ -514,6 +514,10 @@ project("spring-context") {
|
|||
description = "Spring Context"
|
||||
|
||||
apply plugin: "groovy"
|
||||
// Kotlin compiler does not support JDK 9 yet, see https://youtrack.jetbrains.com/issue/KT-14988
|
||||
if (!JavaVersion.current().java9Compatible) {
|
||||
apply plugin: "kotlin"
|
||||
}
|
||||
|
||||
dependencies {
|
||||
compile(project(":spring-aop"))
|
||||
|
|
@ -536,6 +540,7 @@ project("spring-context") {
|
|||
optional("org.aspectj:aspectjweaver:${aspectjVersion}")
|
||||
optional("org.codehaus.groovy:groovy-all:${groovyVersion}")
|
||||
optional("org.beanshell:bsh:2.0b4")
|
||||
optional("org.jetbrains.kotlin:kotlin-stdlib:${kotlinVersion}")
|
||||
testCompile("org.apache.commons:commons-pool2:2.4.2")
|
||||
testCompile("org.slf4j:slf4j-api:${slf4jVersion}")
|
||||
testCompile("javax.inject:javax.inject-tck:1")
|
||||
|
|
@ -581,7 +586,7 @@ project("spring-oxm") {
|
|||
project("spring-messaging") {
|
||||
description = "Spring Messaging"
|
||||
|
||||
// Kotlin compiler does not support JDK 9 yet
|
||||
// Kotlin compiler does not support JDK 9 yet, see https://youtrack.jetbrains.com/issue/KT-14988
|
||||
if (!JavaVersion.current().java9Compatible) {
|
||||
apply plugin: "kotlin"
|
||||
}
|
||||
|
|
@ -726,7 +731,7 @@ project("spring-context-indexer") {
|
|||
project("spring-web") {
|
||||
description = "Spring Web"
|
||||
|
||||
// Kotlin compiler does not support JDK 9 yet
|
||||
// Kotlin compiler does not support JDK 9 yet, see https://youtrack.jetbrains.com/issue/KT-14988
|
||||
if (!JavaVersion.current().java9Compatible) {
|
||||
apply plugin: "kotlin"
|
||||
}
|
||||
|
|
@ -819,7 +824,7 @@ project("spring-web") {
|
|||
project("spring-web-reactive") {
|
||||
description = "Spring Web Reactive"
|
||||
|
||||
// Kotlin compiler does not support JDK 9 yet
|
||||
// Kotlin compiler does not support JDK 9 yet, see https://youtrack.jetbrains.com/issue/KT-14988
|
||||
if (!JavaVersion.current().java9Compatible) {
|
||||
apply plugin: "kotlin"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,29 @@
|
|||
package org.springframework.beans.factory
|
||||
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
/**
|
||||
* Extension for [BeanFactory] providing [KClass] based API.
|
||||
*
|
||||
* @since 5.0
|
||||
*/
|
||||
object BeanFactoryExtension {
|
||||
|
||||
/**
|
||||
* @see BeanFactory.getBean(Class<T>)
|
||||
*/
|
||||
fun <T : Any> BeanFactory.getBean(requiredType: KClass<T>) = getBean(requiredType.java)
|
||||
|
||||
/**
|
||||
* @see BeanFactory.getBean(String, Class<T>)
|
||||
*/
|
||||
fun <T : Any> BeanFactory.getBean(name: String, requiredType: KClass<T>) =
|
||||
getBean(name, requiredType.java)
|
||||
|
||||
/**
|
||||
* @see BeanFactory.getBean(Class<T>, Object...)
|
||||
*/
|
||||
fun <T : Any> BeanFactory.getBean(requiredType: KClass<T>, vararg args:Any) =
|
||||
getBean(requiredType.java, *args)
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,56 @@
|
|||
package org.springframework.beans.factory
|
||||
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
/**
|
||||
* Extension for [ListableBeanFactory] providing [KClass] based API.
|
||||
*
|
||||
* @since 5.0
|
||||
*/
|
||||
object ListableBeanFactoryExtension {
|
||||
|
||||
/**
|
||||
* @see ListableBeanFactory.getBeanNamesForType(Class<?>)
|
||||
*/
|
||||
fun <T : Any> ListableBeanFactory.getBeanNamesForType(type: KClass<T>) =
|
||||
getBeanNamesForType(type.java)
|
||||
|
||||
/**
|
||||
* @see ListableBeanFactory.getBeanNamesForType(Class<?>, boolean, boolean)
|
||||
*/
|
||||
fun <T : Any> ListableBeanFactory.getBeanNamesForType(type: KClass<T>,
|
||||
includeNonSingletons: Boolean, allowEagerInit: Boolean) =
|
||||
getBeanNamesForType(type.java, includeNonSingletons, allowEagerInit)
|
||||
|
||||
/**
|
||||
* @see ListableBeanFactory.getBeansOfType(Class<T>)
|
||||
*/
|
||||
fun <T : Any> ListableBeanFactory.getBeansOfType(type: KClass<T>) =
|
||||
getBeansOfType(type.java)
|
||||
|
||||
/**
|
||||
* @see ListableBeanFactory.getBeansOfType(Class<T>, boolean, boolean)
|
||||
*/
|
||||
fun <T : Any> ListableBeanFactory.getBeansOfType(type: KClass<T>,
|
||||
includeNonSingletons: Boolean, allowEagerInit: Boolean) =
|
||||
getBeansOfType(type.java, includeNonSingletons, allowEagerInit)
|
||||
|
||||
/**
|
||||
* @see ListableBeanFactory.getBeanNamesForAnnotation
|
||||
*/
|
||||
fun <T : Annotation> ListableBeanFactory.getBeanNamesForAnnotation(type: KClass<T>) =
|
||||
getBeanNamesForAnnotation(type.java)
|
||||
|
||||
/**
|
||||
* @see ListableBeanFactory.getBeansWithAnnotation
|
||||
*/
|
||||
fun <T : Annotation> ListableBeanFactory.getBeansWithAnnotation(type: KClass<T>) =
|
||||
getBeansWithAnnotation(type.java)
|
||||
|
||||
/**
|
||||
* @see ListableBeanFactoryExtension.findAnnotationOnBean
|
||||
*/
|
||||
fun <T : Annotation> ListableBeanFactory.findAnnotationOnBean(beanName:String, type: KClass<T>) =
|
||||
findAnnotationOnBean(beanName, type.java)
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,47 @@
|
|||
package org.springframework.context.support
|
||||
|
||||
import org.springframework.beans.factory.config.BeanDefinitionCustomizer
|
||||
import java.util.function.Supplier
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
/**
|
||||
* Extension for [GenericApplicationContext] providing [KClass] based API and
|
||||
* avoiding specifying a class parameter for the [Supplier] based variant thanks to
|
||||
* Kotlin reified type parameters.
|
||||
*
|
||||
* @since 5.0
|
||||
*/
|
||||
object GenericApplicationContextExtension {
|
||||
|
||||
/**
|
||||
* @see GenericApplicationContext.registerBean(Class<T>, BeanDefinitionCustomizer...)
|
||||
*/
|
||||
fun <T : Any> GenericApplicationContext.registerBean(beanClass: KClass<T>,
|
||||
vararg customizers: BeanDefinitionCustomizer) {
|
||||
registerBean(beanClass.java, *customizers)
|
||||
}
|
||||
|
||||
/**
|
||||
* @see GenericApplicationContext.registerBean(String, Class<T>, BeanDefinitionCustomizer...)
|
||||
*/
|
||||
fun <T : Any> GenericApplicationContext.registerBean(beanName: String, beanClass: KClass<T>,
|
||||
vararg customizers: BeanDefinitionCustomizer) {
|
||||
registerBean(beanName, beanClass.java, *customizers)
|
||||
}
|
||||
|
||||
/**
|
||||
* @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)
|
||||
}
|
||||
|
||||
/**
|
||||
* @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)
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,45 @@
|
|||
package org.springframework.context.support
|
||||
|
||||
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 {
|
||||
|
||||
@Test
|
||||
fun registerBeanWithClass() {
|
||||
val context = GenericApplicationContext()
|
||||
context.registerBean(BeanA::class)
|
||||
context.refresh()
|
||||
assertNotNull(context.getBean(BeanA::class))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun registerBeanWithNameAndClass() {
|
||||
val context = GenericApplicationContext()
|
||||
context.registerBean("a", BeanA::class)
|
||||
context.refresh()
|
||||
assertNotNull(context.getBean("a"))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun registerBeanWithSupplier() {
|
||||
val context = GenericApplicationContext()
|
||||
context.registerBean(Supplier { BeanA() })
|
||||
context.refresh()
|
||||
assertNotNull(context.getBean(BeanA::class))
|
||||
}
|
||||
|
||||
@Test
|
||||
fun registerBeanWithNameAndSupplier() {
|
||||
val context = GenericApplicationContext()
|
||||
context.registerBean("a", Supplier { BeanA() })
|
||||
context.refresh()
|
||||
assertNotNull(context.getBean("a"))
|
||||
}
|
||||
|
||||
internal class BeanA
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue