diff --git a/spring-beans/src/main/kotlin/org/springframework/beans/factory/ListableBeanFactoryExtensions.kt b/spring-beans/src/main/kotlin/org/springframework/beans/factory/ListableBeanFactoryExtensions.kt index f50dcff316d7..9ae2e4a20b98 100644 --- a/spring-beans/src/main/kotlin/org/springframework/beans/factory/ListableBeanFactoryExtensions.kt +++ b/spring-beans/src/main/kotlin/org/springframework/beans/factory/ListableBeanFactoryExtensions.kt @@ -16,16 +16,21 @@ package org.springframework.beans.factory +import org.springframework.core.ParameterizedTypeReference +import org.springframework.core.ResolvableType + /** * Extension for [ListableBeanFactory.getBeanNamesForType] providing a - * `getBeanNamesForType()` variant. + * `getBeanNamesForType()` or `getBeanNamesForType>()` variant. * * @author Sebastien Deleuze + * @author Yanming Zhou * @since 5.0 */ inline fun ListableBeanFactory.getBeanNamesForType(includeNonSingletons: Boolean = true, allowEagerInit: Boolean = true): Array = - getBeanNamesForType(T::class.java, includeNonSingletons, allowEagerInit) + getBeanNamesForType(ResolvableType.forType(object : ParameterizedTypeReference() {}), + includeNonSingletons, allowEagerInit) /** * Extension for [ListableBeanFactory.getBeansOfType] providing a `getBeansOfType()` variant. diff --git a/spring-beans/src/test/kotlin/org/springframework/beans/factory/ListableBeanFactoryExtensionsTests.kt b/spring-beans/src/test/kotlin/org/springframework/beans/factory/ListableBeanFactoryExtensionsTests.kt index 66df74130c77..d445a79a30ad 100644 --- a/spring-beans/src/test/kotlin/org/springframework/beans/factory/ListableBeanFactoryExtensionsTests.kt +++ b/spring-beans/src/test/kotlin/org/springframework/beans/factory/ListableBeanFactoryExtensionsTests.kt @@ -20,12 +20,15 @@ import io.mockk.every import io.mockk.mockk import io.mockk.verify import org.junit.jupiter.api.Test +import org.springframework.core.ParameterizedTypeReference +import org.springframework.core.ResolvableType import kotlin.reflect.full.createInstance /** * Mock object based tests for ListableBeanFactory Kotlin extensions * * @author Sebastien Deleuze + * @author Yanming Zhou */ class ListableBeanFactoryExtensionsTests { @@ -34,19 +37,27 @@ class ListableBeanFactoryExtensionsTests { @Test fun `getBeanNamesForType with reified type parameters`() { lbf.getBeanNamesForType() - verify { lbf.getBeanNamesForType(Foo::class.java, true , true) } + verify { lbf.getBeanNamesForType(ResolvableType.forClass(Foo::class.java), true , true) } + } + + @Test + fun `getBeanNamesForType with reified generic type parameters`() { + val foo = listOf(Foo()) + lbf.getBeanNamesForType>() + verify { lbf.getBeanNamesForType(ResolvableType.forType(object : ParameterizedTypeReference>() {}), + true , true) } } @Test fun `getBeanNamesForType with reified type parameters and Boolean`() { lbf.getBeanNamesForType(false) - verify { lbf.getBeanNamesForType(Foo::class.java, false , true) } + verify { lbf.getBeanNamesForType(ResolvableType.forClass(Foo::class.java), false , true) } } @Test fun `getBeanNamesForType with reified type parameters, Boolean and Boolean`() { lbf.getBeanNamesForType(false, false) - verify { lbf.getBeanNamesForType(Foo::class.java, false , false) } + verify { lbf.getBeanNamesForType(ResolvableType.forClass(Foo::class.java), false , false) } } @Test