From 068565172e5d95f971dd6ee9a126d148d8ea028d Mon Sep 17 00:00:00 2001 From: Sebastien Deleuze Date: Thu, 13 Sep 2018 16:38:59 +0200 Subject: [PATCH] Add a BeanFactory#getBeanProvider Kotlin extension Issue: SPR-17274 --- .../beans/factory/BeanFactoryExtensions.kt | 17 ++++++++++++++++- .../beans/factory/BeanFactoryExtensionsTests.kt | 10 +++++++++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/spring-beans/src/main/kotlin/org/springframework/beans/factory/BeanFactoryExtensions.kt b/spring-beans/src/main/kotlin/org/springframework/beans/factory/BeanFactoryExtensions.kt index 67c6bae77a..af52f118f6 100644 --- a/spring-beans/src/main/kotlin/org/springframework/beans/factory/BeanFactoryExtensions.kt +++ b/spring-beans/src/main/kotlin/org/springframework/beans/factory/BeanFactoryExtensions.kt @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -16,6 +16,9 @@ package org.springframework.beans.factory +import org.springframework.core.ParameterizedTypeReference +import org.springframework.core.ResolvableType + /** * Extension for [BeanFactory.getBean] providing a `getBean()` variant. * @@ -44,3 +47,15 @@ inline fun BeanFactory.getBean(name: String): T = */ inline fun BeanFactory.getBean(vararg args:Any): T = getBean(T::class.java, *args) + +/** + * Extension for [BeanFactory.getBeanProvider] providing a `getBeanProvider()` variant. + * This extension is not subject to type erasure and retains actual generic type arguments. + * + * @see BeanFactory.getBeanProvider(ResolvableType) + * @author Sebastien Deleuze + * @since 5.1 + */ +inline fun BeanFactory.getBeanProvider(): ObjectProvider = + getBeanProvider(ResolvableType.forType((object : ParameterizedTypeReference() {}).type)) + diff --git a/spring-beans/src/test/kotlin/org/springframework/beans/factory/BeanFactoryExtensionsTests.kt b/spring-beans/src/test/kotlin/org/springframework/beans/factory/BeanFactoryExtensionsTests.kt index a3b0273de0..85d71758dc 100644 --- a/spring-beans/src/test/kotlin/org/springframework/beans/factory/BeanFactoryExtensionsTests.kt +++ b/spring-beans/src/test/kotlin/org/springframework/beans/factory/BeanFactoryExtensionsTests.kt @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original author or authors. + * Copyright 2002-2018 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. @@ -19,9 +19,11 @@ package org.springframework.beans.factory import org.junit.Test import org.junit.runner.RunWith import org.mockito.Answers +import org.mockito.ArgumentMatchers import org.mockito.Mock import org.mockito.Mockito.* import org.mockito.junit.MockitoJUnitRunner +import org.springframework.core.ResolvableType /** * Mock object based tests for BeanFactory Kotlin extensions. @@ -55,5 +57,11 @@ class BeanFactoryExtensionsTests { verify(bf, times(1)).getBean(Foo::class.java, arg1, arg2) } + @Test + fun `getBeanProvider with reified type parameters`() { + bf.getBeanProvider() + verify(bf, times(1)).getBeanProvider>(ArgumentMatchers.any()) + } + class Foo }