Ignore fallback bean for shortcut resolution
See gh-26241 See gh-28122
This commit is contained in:
		
							parent
							
								
									480051a21c
								
							
						
					
					
						commit
						bc01e3116f
					
				| 
						 | 
				
			
			@ -1408,7 +1408,8 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
 | 
			
		|||
			}
 | 
			
		||||
			if (dependencyName != null &&
 | 
			
		||||
					isTypeMatch(dependencyName, type) && isAutowireCandidate(dependencyName, descriptor) &&
 | 
			
		||||
					!hasPrimaryConflict(dependencyName, type) && !isSelfReference(beanName, dependencyName)) {
 | 
			
		||||
					!isFallback(dependencyName) && !hasPrimaryConflict(dependencyName, type) &&
 | 
			
		||||
					!isSelfReference(beanName, dependencyName)) {
 | 
			
		||||
				if (autowiredBeanNames != null) {
 | 
			
		||||
					autowiredBeanNames.add(dependencyName);
 | 
			
		||||
				}
 | 
			
		||||
| 
						 | 
				
			
			@ -1819,10 +1820,8 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
 | 
			
		|||
		}
 | 
			
		||||
		// Second pass: identify unique non-fallback candidate
 | 
			
		||||
		if (primaryBeanName == null) {
 | 
			
		||||
			for (Map.Entry<String, Object> entry : candidates.entrySet()) {
 | 
			
		||||
				String candidateBeanName = entry.getKey();
 | 
			
		||||
				Object beanInstance = entry.getValue();
 | 
			
		||||
				if (!isFallback(candidateBeanName, beanInstance)) {
 | 
			
		||||
			for (String candidateBeanName : candidates.keySet()) {
 | 
			
		||||
				if (!isFallback(candidateBeanName)) {
 | 
			
		||||
					if (primaryBeanName != null) {
 | 
			
		||||
						return null;
 | 
			
		||||
					}
 | 
			
		||||
| 
						 | 
				
			
			@ -1896,17 +1895,15 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
 | 
			
		|||
	 * Return whether the bean definition for the given bean name has been
 | 
			
		||||
	 * marked as a fallback bean.
 | 
			
		||||
	 * @param beanName the name of the bean
 | 
			
		||||
	 * @param beanInstance the corresponding bean instance (can be {@code null})
 | 
			
		||||
	 * @return whether the given bean qualifies as fallback
 | 
			
		||||
	 * @since 6.2
 | 
			
		||||
	 */
 | 
			
		||||
	protected boolean isFallback(String beanName, Object beanInstance) {
 | 
			
		||||
	private boolean isFallback(String beanName) {
 | 
			
		||||
		String transformedBeanName = transformedBeanName(beanName);
 | 
			
		||||
		if (containsBeanDefinition(transformedBeanName)) {
 | 
			
		||||
			return getMergedLocalBeanDefinition(transformedBeanName).isFallback();
 | 
			
		||||
		}
 | 
			
		||||
		return (getParentBeanFactory() instanceof DefaultListableBeanFactory parent &&
 | 
			
		||||
				parent.isFallback(transformedBeanName, beanInstance));
 | 
			
		||||
				parent.isFallback(transformedBeanName));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/**
 | 
			
		||||
| 
						 | 
				
			
			@ -1954,7 +1951,6 @@ public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFacto
 | 
			
		|||
	 * Determine whether there is a primary bean registered for the given dependency type,
 | 
			
		||||
	 * not matching the given bean name.
 | 
			
		||||
	 */
 | 
			
		||||
	@Nullable
 | 
			
		||||
	private boolean hasPrimaryConflict(String beanName, Class<?> dependencyType) {
 | 
			
		||||
		for (String candidate : this.primaryBeanNames) {
 | 
			
		||||
			if (isTypeMatch(candidate, dependencyType) && !candidate.equals(beanName)) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue