5 changed files with 187 additions and 5 deletions
@ -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