|
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;
|
@@ -326,43 +327,15 @@ public <T> T getBean(Class<T> requiredType) throws BeansException {
|
326 | 327 |
|
327 | 328 | @Override
|
328 | 329 | public <T> T getBean(Class<T> requiredType, Object... args) throws BeansException {
|
329 |
| - Assert.notNull(requiredType, "Required type must not be null"); |
330 |
| - String[] beanNames = getBeanNamesForType(requiredType); |
331 |
| - if (beanNames.length > 1) { |
332 |
| - ArrayList<String> autowireCandidates = new ArrayList<>(); |
333 |
| - for (String beanName : beanNames) { |
334 |
| - if (!containsBeanDefinition(beanName) || getBeanDefinition(beanName).isAutowireCandidate()) { |
335 |
| - autowireCandidates.add(beanName); |
336 |
| - } |
337 |
| - } |
338 |
| - if (autowireCandidates.size() > 0) { |
339 |
| - beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]); |
340 |
| - } |
341 |
| - } |
342 |
| - if (beanNames.length == 1) { |
343 |
| - return getBean(beanNames[0], requiredType, args); |
344 |
| - } |
345 |
| - else if (beanNames.length > 1) { |
346 |
| - Map<String, Object> candidates = new HashMap<>(); |
347 |
| - for (String beanName : beanNames) { |
348 |
| - candidates.put(beanName, getBean(beanName, requiredType, args)); |
349 |
| - } |
350 |
| - String primaryCandidate = determinePrimaryCandidate(candidates, requiredType); |
351 |
| - if (primaryCandidate != null) { |
352 |
| - return getBean(primaryCandidate, requiredType, args); |
353 |
| - } |
354 |
| - String priorityCandidate = determineHighestPriorityCandidate(candidates, requiredType); |
355 |
| - if (priorityCandidate != null) { |
356 |
| - return getBean(priorityCandidate, requiredType, args); |
357 |
| - } |
358 |
| - throw new NoUniqueBeanDefinitionException(requiredType, candidates.keySet()); |
359 |
| - } |
360 |
| - else if (getParentBeanFactory() != null) { |
361 |
| - return getParentBeanFactory().getBean(requiredType, args); |
| 330 | + NamedBeanHolder<T> namedBean = resolveNamedBean(requiredType, args); |
| 331 | + if (namedBean != null) { |
| 332 | + return namedBean.getBeanInstance(); |
362 | 333 | }
|
363 |
| - else { |
364 |
| - throw new NoSuchBeanDefinitionException(requiredType); |
| 334 | + BeanFactory parent = getParentBeanFactory(); |
| 335 | + if (parent != null) { |
| 336 | + return parent.getBean(requiredType, args); |
365 | 337 | }
|
| 338 | + throw new NoSuchBeanDefinitionException(requiredType); |
366 | 339 | }
|
367 | 340 |
|
368 | 341 |
|
@@ -642,13 +615,15 @@ protected boolean isAutowireCandidate(String beanName, DependencyDescriptor desc
|
642 | 615 | else if (containsSingleton(beanName)) {
|
643 | 616 | return isAutowireCandidate(beanName, new RootBeanDefinition(getType(beanName)), descriptor, resolver);
|
644 | 617 | }
|
645 |
| - else if (getParentBeanFactory() instanceof DefaultListableBeanFactory) { |
| 618 | + |
| 619 | + BeanFactory parent = getParentBeanFactory(); |
| 620 | + if (parent instanceof DefaultListableBeanFactory) { |
646 | 621 | // No bean definition found in this factory -> delegate to parent.
|
647 |
| - return ((DefaultListableBeanFactory) getParentBeanFactory()).isAutowireCandidate(beanName, descriptor, resolver); |
| 622 | + return ((DefaultListableBeanFactory) parent).isAutowireCandidate(beanName, descriptor, resolver); |
648 | 623 | }
|
649 |
| - else if (getParentBeanFactory() instanceof ConfigurableListableBeanFactory) { |
| 624 | + else if (parent instanceof ConfigurableListableBeanFactory) { |
650 | 625 | // If no DefaultListableBeanFactory, can't pass the resolver along.
|
651 |
| - return ((ConfigurableListableBeanFactory) getParentBeanFactory()).isAutowireCandidate(beanName, descriptor); |
| 626 | + return ((ConfigurableListableBeanFactory) parent).isAutowireCandidate(beanName, descriptor); |
652 | 627 | }
|
653 | 628 | else {
|
654 | 629 | return true;
|
@@ -989,24 +964,74 @@ private void clearByTypeCache() {
|
989 | 964 | //---------------------------------------------------------------------
|
990 | 965 |
|
991 | 966 | @Override
|
992 |
| - public Object resolveDependency(DependencyDescriptor descriptor, String beanName, |
| 967 | + public <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException { |
| 968 | + NamedBeanHolder<T> namedBean = resolveNamedBean(requiredType, (Object[]) null); |
| 969 | + if (namedBean != null) { |
| 970 | + return namedBean; |
| 971 | + } |
| 972 | + BeanFactory parent = getParentBeanFactory(); |
| 973 | + if (parent instanceof AutowireCapableBeanFactory) { |
| 974 | + return ((AutowireCapableBeanFactory) parent).resolveNamedBean(requiredType); |
| 975 | + } |
| 976 | + return null; |
| 977 | + } |
| 978 | + |
| 979 | + private <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType, Object... args) throws BeansException { |
| 980 | + Assert.notNull(requiredType, "Required type must not be null"); |
| 981 | + String[] beanNames = getBeanNamesForType(requiredType); |
| 982 | + if (beanNames.length > 1) { |
| 983 | + ArrayList<String> autowireCandidates = new ArrayList<>(); |
| 984 | + for (String beanName : beanNames) { |
| 985 | + if (!containsBeanDefinition(beanName) || getBeanDefinition(beanName).isAutowireCandidate()) { |
| 986 | + autowireCandidates.add(beanName); |
| 987 | + } |
| 988 | + } |
| 989 | + if (!autowireCandidates.isEmpty()) { |
| 990 | + beanNames = autowireCandidates.toArray(new String[autowireCandidates.size()]); |
| 991 | + } |
| 992 | + } |
| 993 | + if (beanNames.length == 1) { |
| 994 | + String beanName = beanNames[0]; |
| 995 | + return new NamedBeanHolder<>(beanName, getBean(beanName, requiredType, args)); |
| 996 | + } |
| 997 | + else if (beanNames.length > 1) { |
| 998 | + Map<String, Object> candidates = new LinkedHashMap<>(); |
| 999 | + for (String beanName : beanNames) { |
| 1000 | + candidates.put(beanName, getBean(beanName, requiredType, args)); |
| 1001 | + } |
| 1002 | + String primaryCandidate = determinePrimaryCandidate(candidates, requiredType); |
| 1003 | + if (primaryCandidate != null) { |
| 1004 | + return new NamedBeanHolder<>(primaryCandidate, getBean(primaryCandidate, requiredType, args)); |
| 1005 | + } |
| 1006 | + String priorityCandidate = determineHighestPriorityCandidate(candidates, requiredType); |
| 1007 | + if (priorityCandidate != null) { |
| 1008 | + return new NamedBeanHolder<>(priorityCandidate, getBean(priorityCandidate, requiredType, args)); |
| 1009 | + } |
| 1010 | + throw new NoUniqueBeanDefinitionException(requiredType, candidates.keySet()); |
| 1011 | + } |
| 1012 | + return null; |
| 1013 | + } |
| 1014 | + |
| 1015 | + @Override |
| 1016 | + public Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName, |
993 | 1017 | Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException {
|
994 | 1018 |
|
995 | 1019 | descriptor.initParameterNameDiscovery(getParameterNameDiscoverer());
|
996 | 1020 | if (Optional.class == descriptor.getDependencyType()) {
|
997 |
| - return createOptionalDependency(descriptor, beanName); |
| 1021 | + return createOptionalDependency(descriptor, requestingBeanName); |
998 | 1022 | }
|
999 | 1023 | else if (ObjectFactory.class == descriptor.getDependencyType() ||
|
1000 | 1024 | ObjectProvider.class == descriptor.getDependencyType()) {
|
1001 |
| - return new DependencyObjectProvider(descriptor, beanName); |
| 1025 | + return new DependencyObjectProvider(descriptor, requestingBeanName); |
1002 | 1026 | }
|
1003 | 1027 | else if (javaxInjectProviderClass == descriptor.getDependencyType()) {
|
1004 |
| - return new Jsr330ProviderFactory().createDependencyProvider(descriptor, beanName); |
| 1028 | + return new Jsr330ProviderFactory().createDependencyProvider(descriptor, requestingBeanName); |
1005 | 1029 | }
|
1006 | 1030 | else {
|
1007 |
| - Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary(descriptor, beanName); |
| 1031 | + Object result = getAutowireCandidateResolver().getLazyResolutionProxyIfNecessary( |
| 1032 | + descriptor, requestingBeanName); |
1008 | 1033 | if (result == null) {
|
1009 |
| - result = doResolveDependency(descriptor, beanName, autowiredBeanNames, typeConverter); |
| 1034 | + result = doResolveDependency(descriptor, requestingBeanName, autowiredBeanNames, typeConverter); |
1010 | 1035 | }
|
1011 | 1036 | return result;
|
1012 | 1037 | }
|
@@ -1337,9 +1362,9 @@ protected boolean isPrimary(String beanName, Object beanInstance) {
|
1337 | 1362 | if (containsBeanDefinition(beanName)) {
|
1338 | 1363 | return getMergedLocalBeanDefinition(beanName).isPrimary();
|
1339 | 1364 | }
|
1340 |
| - BeanFactory parentFactory = getParentBeanFactory(); |
1341 |
| - return (parentFactory instanceof DefaultListableBeanFactory && |
1342 |
| - ((DefaultListableBeanFactory) parentFactory).isPrimary(beanName, beanInstance)); |
| 1365 | + BeanFactory parent = getParentBeanFactory(); |
| 1366 | + return (parent instanceof DefaultListableBeanFactory && |
| 1367 | + ((DefaultListableBeanFactory) parent).isPrimary(beanName, beanInstance)); |
1343 | 1368 | }
|
1344 | 1369 |
|
1345 | 1370 | /**
|
@@ -1415,8 +1440,9 @@ private void checkBeanNotOfRequiredType(Class<?> type, DependencyDescriptor desc
|
1415 | 1440 | }
|
1416 | 1441 | }
|
1417 | 1442 |
|
1418 |
| - if (getParentBeanFactory() instanceof DefaultListableBeanFactory) { |
1419 |
| - ((DefaultListableBeanFactory) getParentBeanFactory()).checkBeanNotOfRequiredType(type, descriptor); |
| 1443 | + BeanFactory parent = getParentBeanFactory(); |
| 1444 | + if (parent instanceof DefaultListableBeanFactory) { |
| 1445 | + ((DefaultListableBeanFactory) parent).checkBeanNotOfRequiredType(type, descriptor); |
1420 | 1446 | }
|
1421 | 1447 | }
|
1422 | 1448 |
|
|
0 commit comments