From 770057025371e4f3d6c46aedeadee8a70d8e355f Mon Sep 17 00:00:00 2001 From: Phillip Webb Date: Fri, 6 May 2022 09:51:16 -0700 Subject: [PATCH] Don't consider singleton instances when deducing bean class Update `RegisteredBean` bean class detection to not consider singletons. Prior to this commit, any beans that had been instantiated could return the wrong class, especially if they were implemented using a lambda. See gh-28414 --- .../beans/factory/support/RegisteredBean.java | 7 ------- .../factory/support/RegisteredBeanTests.java | 20 ++++++++++--------- 2 files changed, 11 insertions(+), 16 deletions(-) diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/RegisteredBean.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/RegisteredBean.java index a8d3f0fa4f3..8a0b8361c9f 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/RegisteredBean.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/RegisteredBean.java @@ -158,9 +158,6 @@ public final class RegisteredBean { * @return the bean class */ public Class getBeanClass() { - if (this.beanFactory.containsSingleton(getBeanName())) { - return this.beanFactory.getSingleton(getBeanName()).getClass(); - } return ClassUtils.getUserClass(getBeanType().toClass()); } @@ -169,10 +166,6 @@ public final class RegisteredBean { * @return the bean type */ public ResolvableType getBeanType() { - if (this.beanFactory.containsSingleton(getBeanName())) { - return ResolvableType - .forInstance(this.beanFactory.getSingleton(getBeanName())); - } return getMergedBeanDefinition().getResolvableType(); } diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/support/RegisteredBeanTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/support/RegisteredBeanTests.java index 19f9e0bc44e..d24552076a0 100644 --- a/spring-beans/src/test/java/org/springframework/beans/factory/support/RegisteredBeanTests.java +++ b/spring-beans/src/test/java/org/springframework/beans/factory/support/RegisteredBeanTests.java @@ -21,6 +21,7 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.beans.factory.config.BeanDefinitionHolder; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatExceptionOfType; @@ -112,12 +113,6 @@ class RegisteredBeanTests { assertThat(registeredBean.getBeanClass()).isEqualTo(TestBean.class); } - @Test - void getBeanClassWhenSingletonReturnsBeanClass() { - RegisteredBean registeredBean = RegisteredBean.of(this.beanFactory, "sb"); - assertThat(registeredBean.getBeanClass()).isEqualTo(TestBean.class); - } - @Test void getBeanTypeReturnsBeanType() { RegisteredBean registeredBean = RegisteredBean.of(this.beanFactory, "bd"); @@ -125,9 +120,16 @@ class RegisteredBeanTests { } @Test - void getBeanTypeWhenSingletonReturnsBeanType() { - RegisteredBean registeredBean = RegisteredBean.of(this.beanFactory, "sb"); - assertThat(registeredBean.getBeanType().toClass()).isEqualTo(TestBean.class); + void getBeanTypeWhenHasInstanceBackedByLambdaDoesNotReturnLambdaType() { + this.beanFactory.registerBeanDefinition("bfpp", new RootBeanDefinition( + BeanFactoryPostProcessor.class, RegisteredBeanTests::getBeanFactoryPostProcessorLambda)); + this.beanFactory.getBean("bfpp"); + RegisteredBean registeredBean = RegisteredBean.of(this.beanFactory, "bfpp"); + assertThat(registeredBean.getBeanType().toClass()).isEqualTo(BeanFactoryPostProcessor.class); + } + + static BeanFactoryPostProcessor getBeanFactoryPostProcessorLambda() { + return bf -> {}; } @Test