Browse Source

ObjectProvider stream consistently includes beans from parent context

Issue: SPR-17356
pull/1986/merge
Juergen Hoeller 7 years ago
parent
commit
44afed426a
  1. 6
      spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java
  2. 8
      spring-beans/src/main/java/org/springframework/beans/factory/support/DefaultListableBeanFactory.java

6
spring-beans/src/main/java/org/springframework/beans/factory/BeanFactory.java

@ -225,12 +225,12 @@ public interface BeanFactory { @@ -225,12 +225,12 @@ public interface BeanFactory {
* Note that collection types are not supported here, in contrast to reflective
* injection points. For programmatically retrieving a list of beans matching a
* specific type, specify the actual bean type as an argument here and subsequently
* use {@link ObjectProvider#toList()} or its lazy streaming/iteration options.
* use {@link ObjectProvider#orderedStream()} or its lazy streaming/iteration options.
* @return a corresponding provider handle
* @since 5.1
* @see ObjectProvider#stream()
* @see ObjectProvider#iterator()
* @see ObjectProvider#toList()
* @see ObjectProvider#stream()
* @see ObjectProvider#orderedStream()
*/
<T> ObjectProvider<T> getBeanProvider(ResolvableType requiredType);

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

@ -382,13 +382,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto @@ -382,13 +382,13 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
}
@Override
public Stream<T> stream() {
return Arrays.stream(getBeanNamesForType(requiredType))
return Arrays.stream(getBeanNamesForTypedStream(requiredType))
.map(name -> (T) getBean(name))
.filter(bean -> !(bean instanceof NullBean));
}
@Override
public Stream<T> orderedStream() {
String[] beanNames = getBeanNamesForType(requiredType);
String[] beanNames = getBeanNamesForTypedStream(requiredType);
Map<String, T> matchingBeans = new LinkedHashMap<>(beanNames.length);
for (String beanName : beanNames) {
Object beanInstance = getBean(beanName);
@ -424,6 +424,10 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto @@ -424,6 +424,10 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
return null;
}
private String[] getBeanNamesForTypedStream(ResolvableType requiredType) {
return BeanFactoryUtils.beanNamesForTypeIncludingAncestors(this, requiredType);
}
//---------------------------------------------------------------------
// Implementation of ListableBeanFactory interface

Loading…
Cancel
Save