|
|
|
@ -99,7 +99,8 @@ class OnBeanCondition extends SpringBootCondition implements ConfigurationCondit |
|
|
|
return ConditionOutcome.noMatch( |
|
|
|
return ConditionOutcome.noMatch( |
|
|
|
"@ConditionalOnSingleCandidate " + spec + " found no beans"); |
|
|
|
"@ConditionalOnSingleCandidate " + spec + " found no beans"); |
|
|
|
} |
|
|
|
} |
|
|
|
else if (!hasSingleAutowireCandidate(context.getBeanFactory(), matching)) { |
|
|
|
else if (!hasSingleAutowireCandidate(context.getBeanFactory(), matching, |
|
|
|
|
|
|
|
spec.getStrategy() == SearchStrategy.ALL)) { |
|
|
|
return ConditionOutcome.noMatch("@ConditionalOnSingleCandidate " + spec |
|
|
|
return ConditionOutcome.noMatch("@ConditionalOnSingleCandidate " + spec |
|
|
|
+ " found no primary candidate amongst the" + " following " |
|
|
|
+ " found no primary candidate amongst the" + " following " |
|
|
|
+ matching); |
|
|
|
+ matching); |
|
|
|
@ -225,16 +226,19 @@ class OnBeanCondition extends SpringBootCondition implements ConfigurationCondit |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private boolean hasSingleAutowireCandidate( |
|
|
|
private boolean hasSingleAutowireCandidate( |
|
|
|
ConfigurableListableBeanFactory beanFactory, List<String> beanNames) { |
|
|
|
ConfigurableListableBeanFactory beanFactory, List<String> beanNames, |
|
|
|
|
|
|
|
boolean considerHierarchy) { |
|
|
|
return (beanNames.size() == 1 |
|
|
|
return (beanNames.size() == 1 |
|
|
|
|| getPrimaryBeans(beanFactory, beanNames).size() == 1); |
|
|
|
|| getPrimaryBeans(beanFactory, beanNames, considerHierarchy) |
|
|
|
|
|
|
|
.size() == 1); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private List<String> getPrimaryBeans(ConfigurableListableBeanFactory beanFactory, |
|
|
|
private List<String> getPrimaryBeans(ConfigurableListableBeanFactory beanFactory, |
|
|
|
List<String> beanNames) { |
|
|
|
List<String> beanNames, boolean considerHierarchy) { |
|
|
|
List<String> primaryBeans = new ArrayList<String>(); |
|
|
|
List<String> primaryBeans = new ArrayList<String>(); |
|
|
|
for (String beanName : beanNames) { |
|
|
|
for (String beanName : beanNames) { |
|
|
|
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); |
|
|
|
BeanDefinition beanDefinition = findBeanDefinition(beanFactory, beanName, |
|
|
|
|
|
|
|
considerHierarchy); |
|
|
|
if (beanDefinition != null && beanDefinition.isPrimary()) { |
|
|
|
if (beanDefinition != null && beanDefinition.isPrimary()) { |
|
|
|
primaryBeans.add(beanName); |
|
|
|
primaryBeans.add(beanName); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -242,6 +246,20 @@ class OnBeanCondition extends SpringBootCondition implements ConfigurationCondit |
|
|
|
return primaryBeans; |
|
|
|
return primaryBeans; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
private BeanDefinition findBeanDefinition(ConfigurableListableBeanFactory beanFactory, |
|
|
|
|
|
|
|
String beanName, boolean considerHierarchy) { |
|
|
|
|
|
|
|
if (beanFactory.containsBeanDefinition(beanName)) { |
|
|
|
|
|
|
|
return beanFactory.getBeanDefinition(beanName); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (considerHierarchy && beanFactory |
|
|
|
|
|
|
|
.getParentBeanFactory() instanceof ConfigurableListableBeanFactory) { |
|
|
|
|
|
|
|
return findBeanDefinition(((ConfigurableListableBeanFactory) beanFactory |
|
|
|
|
|
|
|
.getParentBeanFactory()), beanName, considerHierarchy); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private static class BeanSearchSpec { |
|
|
|
private static class BeanSearchSpec { |
|
|
|
|
|
|
|
|
|
|
|
private final Class<?> annotationType; |
|
|
|
private final Class<?> annotationType; |
|
|
|
|