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 ed6f5a66b48..1ef02990008 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-2018 the original author or authors. + * Copyright 2002-2023 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. @@ -21,14 +21,17 @@ import org.springframework.core.ResolvableType /** * Extension for [BeanFactory.getBean] providing a `getBean()` variant. + * This extension is not subject to type erasure and retains actual generic type arguments. * * @author Sebastien Deleuze * @since 5.0 */ -inline fun BeanFactory.getBean(): T = getBean(T::class.java) +inline fun BeanFactory.getBean(): T = + getBeanProvider().getObject() /** * Extension for [BeanFactory.getBean] providing a `getBean("foo")` variant. + * Like the original Java method, this extension is subject to type erasure. * * @see BeanFactory.getBean(String, Class) * @author Sebastien Deleuze @@ -40,13 +43,14 @@ inline fun BeanFactory.getBean(name: String): T = /** * Extension for [BeanFactory.getBean] providing a `getBean(arg1, arg2)` variant. + * This extension is not subject to type erasure and retains actual generic type arguments. * * @see BeanFactory.getBean(Class, Object...) * @author Sebastien Deleuze * @since 5.0 */ inline fun BeanFactory.getBean(vararg args:Any): T = - getBean(T::class.java, *args) + getBeanProvider().getObject(*args) /** * Extension for [BeanFactory.getBeanProvider] providing a `getBeanProvider()` variant. 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 6ba9e5dd50c..f9ba1dafa16 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-2019 the original author or authors. + * Copyright 2002-2023 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,10 +16,12 @@ package org.springframework.beans.factory +import io.mockk.every import io.mockk.mockk import io.mockk.verify import org.junit.jupiter.api.Test import org.springframework.core.ResolvableType +import kotlin.reflect.full.createInstance /** * Mock object based tests for BeanFactory Kotlin extensions. @@ -32,8 +34,10 @@ class BeanFactoryExtensionsTests { @Test fun `getBean with reified type parameters`() { + val foo = Foo() + every { bf.getBeanProvider(ofType()).getObject() } returns foo bf.getBean() - verify { bf.getBean(Foo::class.java) } + verify { bf.getBeanProvider>(ofType()).getObject() } } @Test @@ -47,8 +51,10 @@ class BeanFactoryExtensionsTests { fun `getBean with reified type parameters and varargs`() { val arg1 = "arg1" val arg2 = "arg2" - bf.getBean(arg1, arg2) - verify { bf.getBean(Foo::class.java, arg1, arg2) } + val bar = Bar(arg1, arg2) + every { bf.getBeanProvider(ofType()).getObject(arg1, arg2) } returns bar + bf.getBean(arg1, arg2) + verify { bf.getBeanProvider(ofType()).getObject(arg1, arg2) } } @Test @@ -58,4 +64,7 @@ class BeanFactoryExtensionsTests { } class Foo + + @Suppress("UNUSED_PARAMETER") + class Bar(arg1: String, arg2: String) }