|
32 | 32 | import java.util.Collection;
|
33 | 33 | import java.util.Collections;
|
34 | 34 | import java.util.Comparator;
|
35 |
| -import java.util.HashMap; |
36 | 35 | import java.util.IdentityHashMap;
|
37 | 36 | import java.util.Iterator;
|
38 | 37 | import java.util.LinkedHashMap;
|
|
62 | 61 | import org.springframework.beans.factory.ObjectProvider;
|
63 | 62 | import org.springframework.beans.factory.SmartFactoryBean;
|
64 | 63 | import org.springframework.beans.factory.SmartInitializingSingleton;
|
| 64 | +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; |
65 | 65 | import org.springframework.beans.factory.config.BeanDefinition;
|
66 | 66 | import org.springframework.beans.factory.config.BeanDefinitionHolder;
|
67 | 67 | import org.springframework.beans.factory.config.ConfigurableBeanFactory;
|
68 | 68 | import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
69 | 69 | import org.springframework.beans.factory.config.DependencyDescriptor;
|
| 70 | +import org.springframework.beans.factory.config.NamedBeanHolder; |
70 | 71 | import org.springframework.core.OrderComparator;
|
71 | 72 | import org.springframework.core.ResolvableType;
|
72 | 73 | import org.springframework.core.annotation.AnnotationUtils;
|
@@ -336,43 +337,15 @@ public <T> T getBean(Class<T> requiredType) throws BeansException {
|
336 | 337 |
|
337 | 338 | @Override
|
338 | 339 | public <T> T getBean(Class<T> requiredType, Object... args) throws BeansException {
|
339 |
| - Assert.notNull(requiredType, "Required type must not be null"); |
340 |
| - String[] beanNames = getBeanNamesForType(requiredType); |
341 |
| - if (beanNames.length > 1) { |
342 |
| - ArrayList<String> autowireCandidates = new ArrayList<String>(); |
343 |
| - for (String beanName : beanNames) { |
344 |
| - if (!containsBeanDefinition(beanName) || getBeanDefinition(beanName).isAutowireCandidate()) { |
345 |
| - autowireCandidates.add(beanName); |
346 |
| - } |
347 |
| - } |
348 |
| - if (autowireCandidates.size() > 0) { |
349 |
| - beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]); |
350 |
| - } |
351 |
| - } |
352 |
| - if (beanNames.length == 1) { |
353 |
| - return getBean(beanNames[0], requiredType, args); |
354 |
| - } |
355 |
| - else if (beanNames.length > 1) { |
356 |
| - Map<String, Object> candidates = new HashMap<String, Object>(); |
357 |
| - for (String beanName : beanNames) { |
358 |
| - candidates.put(beanName, getBean(beanName, requiredType, args)); |
359 |
| - } |
360 |
| - String primaryCandidate = determinePrimaryCandidate(candidates, requiredType); |
361 |
| - if (primaryCandidate != null) { |
362 |
| - return getBean(primaryCandidate, requiredType, args); |
363 |
| - } |
364 |
| - String priorityCandidate = determineHighestPriorityCandidate(candidates, requiredType); |
365 |
| - if (priorityCandidate != null) { |
366 |
| - return getBean(priorityCandidate, requiredType, args); |
367 |
| - } |
368 |
| - throw new NoUniqueBeanDefinitionException(requiredType, candidates.keySet()); |
369 |
| - } |
370 |
| - else if (getParentBeanFactory() != null) { |
371 |
| - return getParentBeanFactory().getBean(requiredType, args); |
| 340 | + NamedBeanHolder<T> namedBean = resolveNamedBean(requiredType, args); |
| 341 | + if (namedBean != null) { |
| 342 | + return namedBean.getBeanInstance(); |
372 | 343 | }
|
373 |
| - else { |
374 |
| - throw new NoSuchBeanDefinitionException(requiredType); |
| 344 | + BeanFactory parent = getParentBeanFactory(); |
| 345 | + if (parent != null) { |
| 346 | + return parent.getBean(requiredType, args); |
375 | 347 | }
|
| 348 | + throw new NoSuchBeanDefinitionException(requiredType); |
376 | 349 | }
|
377 | 350 |
|
378 | 351 |
|
@@ -652,13 +625,15 @@ protected boolean isAutowireCandidate(String beanName, DependencyDescriptor desc
|
652 | 625 | else if (containsSingleton(beanName)) {
|
653 | 626 | return isAutowireCandidate(beanName, new RootBeanDefinition(getType(beanName)), descriptor, resolver);
|
654 | 627 | }
|
655 |
| - else if (getParentBeanFactory() instanceof DefaultListableBeanFactory) { |
| 628 | + |
| 629 | + BeanFactory parent = getParentBeanFactory(); |
| 630 | + if (parent instanceof DefaultListableBeanFactory) { |
656 | 631 | // No bean definition found in this factory -> delegate to parent.
|
657 |
| - return ((DefaultListableBeanFactory) getParentBeanFactory()).isAutowireCandidate(beanName, descriptor, resolver); |
| 632 | + return ((DefaultListableBeanFactory) parent).isAutowireCandidate(beanName, descriptor, resolver); |
658 | 633 | }
|
659 |
| - else if (getParentBeanFactory() instanceof ConfigurableListableBeanFactory) { |
| 634 | + else if (parent instanceof ConfigurableListableBeanFactory) { |
660 | 635 | // If no DefaultListableBeanFactory, can't pass the resolver along.
|
661 |
| - return ((ConfigurableListableBeanFactory) getParentBeanFactory()).isAutowireCandidate(beanName, descriptor); |
| 636 | + return ((ConfigurableListableBeanFactory) parent).isAutowireCandidate(beanName, descriptor); |
662 | 637 | }
|
663 | 638 | else {
|
664 | 639 | return true;
|
@@ -999,24 +974,74 @@ private void clearByTypeCache() {
|
999 | 974 | //---------------------------------------------------------------------
|
1000 | 975 |
|
1001 | 976 | @Override
|
1002 |
| - public Object resolveDependency(DependencyDescriptor descriptor, String beanName, |
| 977 | + public <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException { |
| 978 | + NamedBeanHolder<T> namedBean = resolveNamedBean(requiredType, (Object[]) null); |
| 979 | + if (namedBean != null) { |
| 980 | + return namedBean; |
| 981 | + } |
| 982 | + BeanFactory parent = getParentBeanFactory(); |
| 983 | + if (parent instanceof AutowireCapableBeanFactory) { |
| 984 | + return ((AutowireCapableBeanFactory) parent).resolveNamedBean(requiredType); |
| 985 | + } |
| 986 | + return null; |
| 987 | + } |
| 988 | + |
| 989 | + private <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType, Object... args) throws BeansException { |
| 990 | + Assert.notNull(requiredType, "Required type must not be null"); |
| 991 | + String[] beanNames = getBeanNamesForType(requiredType); |
| 992 | + if (beanNames.length > 1) { |
| 993 | + ArrayList<String> autowireCandidates = new ArrayList<String>(); |
| 994 | + for (String beanName : beanNames) { |
| 995 | + if (!containsBeanDefinition(beanName) || getBeanDefinition(beanName).isAutowireCandidate()) { |
| 996 | + autowireCandidates.add(beanName); |
| 997 | + } |
| 998 | + } |
| 999 | + if (!autowireCandidates.isEmpty()) { |
| 1000 | + beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]); |
| 1001 | + } |
| 1002 | + } |
| 1003 | + if (beanNames.length == 1) { |
| 1004 | + String beanName = beanNames[0]; |
| 1005 | + return new NamedBeanHolder<T>(beanName, getBean(beanName, requiredType, args)); |
| 1006 | + } |
| 1007 | + else if (beanNames.length > 1) { |
| 1008 | + Map<String, Object> candidates = new LinkedHashMap<String, Object>(); |
| 1009 | + for (String beanName : beanNames) { |
| 1010 | + candidates.put(beanName, getBean(beanName, requiredType, args)); |
| 1011 | + } |
| 1012 | + String primaryCandidate = determinePrimaryCandidate(candidates, requiredType); |
| 1013 | + if (primaryCandidate != null) { |
| 1014 | + return new NamedBeanHolder<T>(primaryCandidate, getBean(primaryCandidate, requiredType, args)); |
| 1015 | + } |
| 1016 | + String priorityCandidate = determineHighestPriorityCandidate(candidates, requiredType); |
| 1017 | + if (priorityCandidate != null) { |
| 1018 | + return new NamedBeanHolder<T>(priorityCandidate, getBean(priorityCandidate, requiredType, args)); |
| 1019 | + } |
| 1020 | + throw new NoUniqueBeanDefinitionException(requiredType, candidates.keySet()); |
| 1021 | + } |
| 1022 | + return null; |
| 1023 | + } |
| 1024 | + |
| 1025 | + @Override |
| 1026 | + public Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName, |
1003 | 1027 | Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException {
|
1004 | 1028 |
|
1005 | 1029 | descriptor.initParameterNameDiscovery(getParameterNameDiscoverer());
|
1006 | 1030 | if (javaUtilOptionalClass == descriptor.getDependencyType()) {
|
1007 |
| - return new OptionalDependencyFactory().createOptionalDependency(descriptor, beanName); |
| 1031 | + return new OptionalDependencyFactory().createOptionalDependency(descriptor, requestingBeanName); |
1008 | 1032 | }
|
1009 | 1033 | else if (ObjectFactory.class == descriptor.getDependencyType() ||
|
1010 | 1034 | ObjectProvider.class == descriptor.getDependencyType()) {
|
1011 |
| - return new DependencyObjectProvider(descriptor, beanName); |
| 1035 | + return new DependencyObjectProvider(descriptor, requestingBeanName); |
1012 | 1036 | }
|
1013 | 1037 | else if (javaxInjectProviderClass == descriptor.getDependencyType()) {
|
1014 |
| - return new Jsr330ProviderFactory().createDependencyProvider(descriptor, beanName); |
| 1038 | + return new Jsr330ProviderFactory().createDependencyProvider(descriptor, requestingBeanName); |
1015 | 1039 | }
|
1016 | 1040 | else {
|
1017 |
| - Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(descriptor, beanName); |
| 1041 | + Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary( |
| 1042 | + descriptor, requestingBeanName); |
1018 | 1043 | if (result == null) {
|
1019 |
| - result = doResolveDependency(descriptor, beanName, autowiredBeanNames, typeConverter); |
| 1044 | + result = doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter); |
1020 | 1045 | }
|
1021 | 1046 | return result;
|
1022 | 1047 | }
|
@@ -1347,9 +1372,9 @@ protected boolean isPrimary(String beanName, Object beanInstance) {
|
1347 | 1372 | if (containsBeanDefinition(beanName)) {
|
1348 | 1373 | return getMergedLocalBeanDefinition(beanName).isPrimary();
|
1349 | 1374 | }
|
1350 |
| - BeanFactory parentFactory = getParentBeanFactory(); |
1351 |
| - return (parentFactory instanceof DefaultListableBeanFactory && |
1352 |
| - ((DefaultListableBeanFactory) parentFactory).isPrimary(beanName, beanInstance)); |
| 1375 | + BeanFactory parent = getParentBeanFactory(); |
| 1376 | + return (parent instanceof DefaultListableBeanFactory && |
| 1377 | + ((DefaultListableBeanFactory) parent).isPrimary(beanName, beanInstance)); |
1353 | 1378 | }
|
1354 | 1379 |
|
1355 | 1380 | /**
|
@@ -1425,8 +1450,9 @@ private void checkBeanNotOfRequiredType(Class<?> type, DependencyDescriptor desc
|
1425 | 1450 | }
|
1426 | 1451 | }
|
1427 | 1452 |
|
1428 |
| - if (getParentBeanFactory() instanceof DefaultListableBeanFactory) { |
1429 |
| - ((DefaultListableBeanFactory) getParentBeanFactory()).checkBeanNotOfRequiredType(type, descriptor); |
| 1453 | + BeanFactory parent = getParentBeanFactory(); |
| 1454 | + if (parent instanceof DefaultListableBeanFactory) { |
| 1455 | + ((DefaultListableBeanFactory) parent).checkBeanNotOfRequiredType(type, descriptor); |
1430 | 1456 | }
|
1431 | 1457 | }
|
1432 | 1458 |
|
|
0 commit comments