Skip to content

Commit 7700570

Browse files
committed
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
1 parent 2b65f27 commit 7700570

File tree

2 files changed

+11
-16
lines changed

2 files changed

+11
-16
lines changed

spring-beans/src/main/java/org/springframework/beans/factory/support/RegisteredBean.java

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,9 +158,6 @@ public ConfigurableBeanFactory getBeanFactory() {
158158
* @return the bean class
159159
*/
160160
public Class<?> getBeanClass() {
161-
if (this.beanFactory.containsSingleton(getBeanName())) {
162-
return this.beanFactory.getSingleton(getBeanName()).getClass();
163-
}
164161
return ClassUtils.getUserClass(getBeanType().toClass());
165162
}
166163

@@ -169,10 +166,6 @@ public Class<?> getBeanClass() {
169166
* @return the bean type
170167
*/
171168
public ResolvableType getBeanType() {
172-
if (this.beanFactory.containsSingleton(getBeanName())) {
173-
return ResolvableType
174-
.forInstance(this.beanFactory.getSingleton(getBeanName()));
175-
}
176169
return getMergedBeanDefinition().getResolvableType();
177170
}
178171

spring-beans/src/test/java/org/springframework/beans/factory/support/RegisteredBeanTests.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
2323
import org.springframework.beans.factory.config.BeanDefinitionHolder;
24+
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
2425

2526
import static org.assertj.core.api.Assertions.assertThat;
2627
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
@@ -112,22 +113,23 @@ void getBeanClassReturnsBeanClass() {
112113
assertThat(registeredBean.getBeanClass()).isEqualTo(TestBean.class);
113114
}
114115

115-
@Test
116-
void getBeanClassWhenSingletonReturnsBeanClass() {
117-
RegisteredBean registeredBean = RegisteredBean.of(this.beanFactory, "sb");
118-
assertThat(registeredBean.getBeanClass()).isEqualTo(TestBean.class);
119-
}
120-
121116
@Test
122117
void getBeanTypeReturnsBeanType() {
123118
RegisteredBean registeredBean = RegisteredBean.of(this.beanFactory, "bd");
124119
assertThat(registeredBean.getBeanType().toClass()).isEqualTo(TestBean.class);
125120
}
126121

127122
@Test
128-
void getBeanTypeWhenSingletonReturnsBeanType() {
129-
RegisteredBean registeredBean = RegisteredBean.of(this.beanFactory, "sb");
130-
assertThat(registeredBean.getBeanType().toClass()).isEqualTo(TestBean.class);
123+
void getBeanTypeWhenHasInstanceBackedByLambdaDoesNotReturnLambdaType() {
124+
this.beanFactory.registerBeanDefinition("bfpp", new RootBeanDefinition(
125+
BeanFactoryPostProcessor.class, RegisteredBeanTests::getBeanFactoryPostProcessorLambda));
126+
this.beanFactory.getBean("bfpp");
127+
RegisteredBean registeredBean = RegisteredBean.of(this.beanFactory, "bfpp");
128+
assertThat(registeredBean.getBeanType().toClass()).isEqualTo(BeanFactoryPostProcessor.class);
129+
}
130+
131+
static BeanFactoryPostProcessor getBeanFactoryPostProcessorLambda() {
132+
return bf -> {};
131133
}
132134

133135
@Test

0 commit comments

Comments
 (0)