diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/support/StaticListableBeanFactory.java b/spring-beans/src/main/java/org/springframework/beans/factory/support/StaticListableBeanFactory.java index 7d77a45b0d7..6262215b37a 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/support/StaticListableBeanFactory.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/support/StaticListableBeanFactory.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2020 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. @@ -45,20 +45,22 @@ import org.springframework.util.StringUtils; /** * Static {@link org.springframework.beans.factory.BeanFactory} implementation - * which allows to register existing singleton instances programmatically. - * Does not have support for prototype beans or aliases. + * which allows one to register existing singleton instances programmatically. * - *
Serves as example for a simple implementation of the + *
Does not have support for prototype beans or aliases. + * + *
Serves as an example for a simple implementation of the * {@link org.springframework.beans.factory.ListableBeanFactory} interface, * managing existing bean instances rather than creating new ones based on bean * definitions, and not implementing any extended SPI interfaces (such as * {@link org.springframework.beans.factory.config.ConfigurableBeanFactory}). * - *
For a full-fledged factory based on bean definitions, have a look - * at {@link DefaultListableBeanFactory}. + *
For a full-fledged factory based on bean definitions, have a look at
+ * {@link DefaultListableBeanFactory}.
*
* @author Rod Johnson
* @author Juergen Hoeller
+ * @author Sam Brannen
* @since 06.01.2003
* @see DefaultListableBeanFactory
*/
@@ -83,7 +85,7 @@ public class StaticListableBeanFactory implements ListableBeanFactory {
* or {@link java.util.Collections#emptyMap()} for a dummy factory which
* enforces operating against an empty set of beans.
* @param beans a {@code Map} for holding this factory's beans, with the
- * bean name String as key and the corresponding singleton object as value
+ * bean name as key and the corresponding singleton object as value
* @since 4.3
*/
public StaticListableBeanFactory(Map Will overwrite any existing instance for the given name.
* @param name the name of the bean
* @param bean the bean instance
*/
@@ -262,7 +264,10 @@ public class StaticListableBeanFactory implements ListableBeanFactory {
public boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
Object bean = getBean(name);
// In case of FactoryBean, return singleton status of created object.
- return (bean instanceof FactoryBean && ((FactoryBean>) bean).isSingleton());
+ if (bean instanceof FactoryBean) {
+ return ((FactoryBean>) bean).isSingleton();
+ }
+ return true;
}
@Override
@@ -337,7 +342,6 @@ public class StaticListableBeanFactory implements ListableBeanFactory {
return getBeanNamesForType(type, true, true);
}
-
@Override
public String[] getBeanNamesForType(@Nullable ResolvableType type,
boolean includeNonSingletons, boolean allowEagerInit) {
diff --git a/spring-beans/src/test/java/org/springframework/beans/factory/BeanFactoryUtilsTests.java b/spring-beans/src/test/java/org/springframework/beans/factory/BeanFactoryUtilsTests.java
index 104556d614c..a84a028eae5 100644
--- a/spring-beans/src/test/java/org/springframework/beans/factory/BeanFactoryUtilsTests.java
+++ b/spring-beans/src/test/java/org/springframework/beans/factory/BeanFactoryUtilsTests.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2019 the original author or authors.
+ * Copyright 2002-2020 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.
@@ -43,6 +43,7 @@ import static org.springframework.core.testfixture.io.ResourceTestUtils.qualifie
* @author Rod Johnson
* @author Juergen Hoeller
* @author Chris Beams
+ * @author Sam Brannen
* @since 04.07.2003
*/
public class BeanFactoryUtilsTests {
@@ -323,4 +324,106 @@ public class BeanFactoryUtilsTests {
assertThat(Arrays.equals(new String[] { "buffer" }, deps)).isTrue();
}
+ @Test
+ public void isSingletonAndIsPrototypeWithStaticFactory() {
+ StaticListableBeanFactory lbf = new StaticListableBeanFactory();
+ TestBean bean = new TestBean();
+ DummyFactory fb1 = new DummyFactory();
+ DummyFactory fb2 = new DummyFactory();
+ fb2.setSingleton(false);
+ TestBeanSmartFactoryBean sfb1 = new TestBeanSmartFactoryBean(true, true);
+ TestBeanSmartFactoryBean sfb2 = new TestBeanSmartFactoryBean(true, false);
+ TestBeanSmartFactoryBean sfb3 = new TestBeanSmartFactoryBean(false, true);
+ TestBeanSmartFactoryBean sfb4 = new TestBeanSmartFactoryBean(false, false);
+ lbf.addBean("bean", bean);
+ lbf.addBean("fb1", fb1);
+ lbf.addBean("fb2", fb2);
+ lbf.addBean("sfb1", sfb1);
+ lbf.addBean("sfb2", sfb2);
+ lbf.addBean("sfb3", sfb3);
+ lbf.addBean("sfb4", sfb4);
+
+ Map