Allow early OnBeanCondition filtering
Update `OnBeanCondition` to be an `AutoConfigurationImportFilter` and filter out classes early. See gh-13328
This commit is contained in:
parent
586507c49a
commit
c2f8398c06
|
@ -34,6 +34,7 @@ import org.springframework.beans.factory.HierarchicalBeanFactory;
|
||||||
import org.springframework.beans.factory.ListableBeanFactory;
|
import org.springframework.beans.factory.ListableBeanFactory;
|
||||||
import org.springframework.beans.factory.config.BeanDefinition;
|
import org.springframework.beans.factory.config.BeanDefinition;
|
||||||
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
|
||||||
|
import org.springframework.boot.autoconfigure.AutoConfigurationMetadata;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionMessage.Style;
|
import org.springframework.boot.autoconfigure.condition.ConditionMessage.Style;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Condition;
|
import org.springframework.context.annotation.Condition;
|
||||||
|
@ -58,7 +59,8 @@ import org.springframework.util.StringUtils;
|
||||||
* @author Andy Wilkinson
|
* @author Andy Wilkinson
|
||||||
*/
|
*/
|
||||||
@Order(Ordered.LOWEST_PRECEDENCE)
|
@Order(Ordered.LOWEST_PRECEDENCE)
|
||||||
class OnBeanCondition extends SpringBootCondition implements ConfigurationCondition {
|
class OnBeanCondition extends FilteringSpringBootCondition
|
||||||
|
implements ConfigurationCondition {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bean definition attribute name for factory beans to signal their product type (if
|
* Bean definition attribute name for factory beans to signal their product type (if
|
||||||
|
@ -66,6 +68,40 @@ class OnBeanCondition extends SpringBootCondition implements ConfigurationCondit
|
||||||
*/
|
*/
|
||||||
public static final String FACTORY_BEAN_OBJECT_TYPE = BeanTypeRegistry.FACTORY_BEAN_OBJECT_TYPE;
|
public static final String FACTORY_BEAN_OBJECT_TYPE = BeanTypeRegistry.FACTORY_BEAN_OBJECT_TYPE;
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected final ConditionOutcome[] getOutcomes(String[] autoConfigurationClasses,
|
||||||
|
AutoConfigurationMetadata autoConfigurationMetadata) {
|
||||||
|
ConditionOutcome[] outcomes = new ConditionOutcome[autoConfigurationClasses.length];
|
||||||
|
for (int i = 0; i < outcomes.length; i++) {
|
||||||
|
String autoConfigurationClass = autoConfigurationClasses[i];
|
||||||
|
if (autoConfigurationClass != null) {
|
||||||
|
Set<String> onBeanTypes = autoConfigurationMetadata
|
||||||
|
.getSet(autoConfigurationClass, "ConditionalOnBean");
|
||||||
|
outcomes[i] = getOutcome(onBeanTypes, ConditionalOnBean.class);
|
||||||
|
if (outcomes[i] == null) {
|
||||||
|
Set<String> onSingleCandidateTypes = autoConfigurationMetadata.getSet(
|
||||||
|
autoConfigurationClass, "ConditionalOnSingleCandidate");
|
||||||
|
outcomes[i] = getOutcome(onSingleCandidateTypes,
|
||||||
|
ConditionalOnSingleCandidate.class);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return outcomes;
|
||||||
|
}
|
||||||
|
|
||||||
|
private ConditionOutcome getOutcome(Set<String> requiredBeanTypes,
|
||||||
|
Class<? extends Annotation> annotation) {
|
||||||
|
List<String> missing = filter(requiredBeanTypes, ClassNameFilter.MISSING,
|
||||||
|
getBeanClassLoader());
|
||||||
|
if (!missing.isEmpty()) {
|
||||||
|
ConditionMessage message = ConditionMessage.forCondition(annotation)
|
||||||
|
.didNotFind("required type", "required types")
|
||||||
|
.items(Style.QUOTE, missing);
|
||||||
|
return ConditionOutcome.noMatch(message);
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ConfigurationPhase getConfigurationPhase() {
|
public ConfigurationPhase getConfigurationPhase() {
|
||||||
return ConfigurationPhase.REGISTER_BEAN;
|
return ConfigurationPhase.REGISTER_BEAN;
|
||||||
|
@ -337,7 +373,6 @@ class OnBeanCondition extends SpringBootCondition implements ConfigurationCondit
|
||||||
.getParentBeanFactory()), beanName, considerHierarchy);
|
.getParentBeanFactory()), beanName, considerHierarchy);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class BeanSearchSpec {
|
private static class BeanSearchSpec {
|
||||||
|
|
|
@ -17,6 +17,7 @@ org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoCo
|
||||||
|
|
||||||
# Auto Configuration Import Filters
|
# Auto Configuration Import Filters
|
||||||
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
|
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
|
||||||
|
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
|
||||||
org.springframework.boot.autoconfigure.condition.OnClassCondition
|
org.springframework.boot.autoconfigure.condition.OnClassCondition
|
||||||
|
|
||||||
# Auto Configure
|
# Auto Configure
|
||||||
|
|
Loading…
Reference in New Issue