Commit 34c31ce0 authored by Phillip Webb's avatar Phillip Webb

Remove BeanTypeRegistry

Remove `BeanTypeRegistry` and rely entirely on standard calls Spring
Framework APIs.

Closes gh-17594
parent 4d21efcc
...@@ -36,7 +36,6 @@ import org.springframework.beans.factory.ListableBeanFactory; ...@@ -36,7 +36,6 @@ 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.AutoConfigurationMetadata;
import org.springframework.boot.autoconfigure.condition.BeanTypeRegistry.TypeExtractor;
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;
...@@ -56,6 +55,7 @@ import org.springframework.util.Assert; ...@@ -56,6 +55,7 @@ import org.springframework.util.Assert;
import org.springframework.util.ClassUtils; import org.springframework.util.ClassUtils;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
import org.springframework.util.ObjectUtils;
import org.springframework.util.ReflectionUtils; import org.springframework.util.ReflectionUtils;
import org.springframework.util.StringUtils; import org.springframework.util.StringUtils;
...@@ -74,8 +74,6 @@ import org.springframework.util.StringUtils; ...@@ -74,8 +74,6 @@ import org.springframework.util.StringUtils;
@Order(Ordered.LOWEST_PRECEDENCE) @Order(Ordered.LOWEST_PRECEDENCE)
class OnBeanCondition extends FilteringSpringBootCondition implements ConfigurationCondition { class OnBeanCondition extends FilteringSpringBootCondition implements ConfigurationCondition {
private static final TypeExtractor RESOLVING_EXTRACTOR = ResolvableType::resolve;
@Override @Override
public ConfigurationPhase getConfigurationPhase() { public ConfigurationPhase getConfigurationPhase() {
return ConfigurationPhase.REGISTER_BEAN; return ConfigurationPhase.REGISTER_BEAN;
...@@ -228,8 +226,11 @@ class OnBeanCondition extends FilteringSpringBootCondition implements Configurat ...@@ -228,8 +226,11 @@ class OnBeanCondition extends FilteringSpringBootCondition implements Configurat
private Set<String> collectBeanNamesForType(ListableBeanFactory beanFactory, boolean considerHierarchy, private Set<String> collectBeanNamesForType(ListableBeanFactory beanFactory, boolean considerHierarchy,
Class<?> type, Set<Class<?>> parameterizedContainers, Set<String> result) { Class<?> type, Set<Class<?>> parameterizedContainers, Set<String> result) {
BeanTypeRegistry registry = BeanTypeRegistry.get(beanFactory); result = addAll(result, beanFactory.getBeanNamesForType(type, true, false));
result = addAll(result, registry.getNamesForType(type, getTypeExtractor(parameterizedContainers))); for (Class<?> container : parameterizedContainers) {
ResolvableType generic = ResolvableType.forClassWithGenerics(container, type);
result = addAll(result, beanFactory.getBeanNamesForType(generic, true, false));
}
if (considerHierarchy && beanFactory instanceof HierarchicalBeanFactory) { if (considerHierarchy && beanFactory instanceof HierarchicalBeanFactory) {
BeanFactory parent = ((HierarchicalBeanFactory) beanFactory).getParentBeanFactory(); BeanFactory parent = ((HierarchicalBeanFactory) beanFactory).getParentBeanFactory();
if (parent instanceof ListableBeanFactory) { if (parent instanceof ListableBeanFactory) {
...@@ -261,8 +262,7 @@ class OnBeanCondition extends FilteringSpringBootCondition implements Configurat ...@@ -261,8 +262,7 @@ class OnBeanCondition extends FilteringSpringBootCondition implements Configurat
private Set<String> collectBeanNamesForAnnotation(ListableBeanFactory beanFactory, private Set<String> collectBeanNamesForAnnotation(ListableBeanFactory beanFactory,
Class<? extends Annotation> annotationType, boolean considerHierarchy, Set<String> result) { Class<? extends Annotation> annotationType, boolean considerHierarchy, Set<String> result) {
BeanTypeRegistry registry = BeanTypeRegistry.get(beanFactory); result = addAll(result, beanFactory.getBeanNamesForAnnotation(annotationType));
result = addAll(result, registry.getNamesForAnnotation(annotationType));
if (considerHierarchy) { if (considerHierarchy) {
BeanFactory parent = ((HierarchicalBeanFactory) beanFactory).getParentBeanFactory(); BeanFactory parent = ((HierarchicalBeanFactory) beanFactory).getParentBeanFactory();
if (parent instanceof ListableBeanFactory) { if (parent instanceof ListableBeanFactory) {
...@@ -281,15 +281,6 @@ class OnBeanCondition extends FilteringSpringBootCondition implements Configurat ...@@ -281,15 +281,6 @@ class OnBeanCondition extends FilteringSpringBootCondition implements Configurat
return beanFactory.containsLocalBean(beanName); return beanFactory.containsLocalBean(beanName);
} }
private Set<String> addAll(Set<String> result, Collection<String> additional) {
if (CollectionUtils.isEmpty(additional)) {
return result;
}
result = (result != null) ? result : new LinkedHashSet<>();
result.addAll(additional);
return result;
}
private String createOnBeanNoMatchReason(MatchResult matchResult) { private String createOnBeanNoMatchReason(MatchResult matchResult) {
StringBuilder reason = new StringBuilder(); StringBuilder reason = new StringBuilder();
appendMessageForNoMatches(reason, matchResult.getUnmatchedAnnotations(), "annotated with"); appendMessageForNoMatches(reason, matchResult.getUnmatchedAnnotations(), "annotated with");
...@@ -370,26 +361,24 @@ class OnBeanCondition extends FilteringSpringBootCondition implements Configurat ...@@ -370,26 +361,24 @@ class OnBeanCondition extends FilteringSpringBootCondition implements Configurat
return null; return null;
} }
private TypeExtractor getTypeExtractor(Set<Class<?>> parameterizedContainers) { private static Set<String> addAll(Set<String> result, Collection<String> additional) {
if (parameterizedContainers.isEmpty()) { if (CollectionUtils.isEmpty(additional)) {
return RESOLVING_EXTRACTOR; return result;
} }
return (type) -> { result = (result != null) ? result : new LinkedHashSet<>();
Class<?> resolved = RESOLVING_EXTRACTOR.getBeanType(type); result.addAll(additional);
if (isParameterizedContainer(resolved, parameterizedContainers)) { return result;
resolved = type.getGeneric().resolve();
}
return resolved;
};
} }
private boolean isParameterizedContainer(Class<?> type, Set<Class<?>> parameterizedContainers) { private static Set<String> addAll(Set<String> result, String[] additional) {
for (Class<?> parameterizedContainer : parameterizedContainers) { if (ObjectUtils.isEmpty(additional)) {
if (parameterizedContainer.isAssignableFrom(type)) { return result;
return true;
}
} }
return false; result = (result != null) ? result : new LinkedHashSet<>();
for (String addition : additional) {
result.add(addition);
}
return result;
} }
/** /**
......
...@@ -438,7 +438,7 @@ public class ConditionalOnMissingBeanTests { ...@@ -438,7 +438,7 @@ public class ConditionalOnMissingBeanTests {
public void registerBeanDefinitions(AnnotationMetadata meta, BeanDefinitionRegistry registry) { public void registerBeanDefinitions(AnnotationMetadata meta, BeanDefinitionRegistry registry) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(NonspecificFactoryBean.class); BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(NonspecificFactoryBean.class);
builder.addConstructorArgValue("foo"); builder.addConstructorArgValue("foo");
builder.getBeanDefinition().setAttribute(BeanTypeRegistry.FACTORY_BEAN_OBJECT_TYPE, ExampleBean.class); builder.getBeanDefinition().setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, ExampleBean.class);
registry.registerBeanDefinition("exampleBeanFactoryBean", builder.getBeanDefinition()); registry.registerBeanDefinition("exampleBeanFactoryBean", builder.getBeanDefinition());
} }
...@@ -456,8 +456,7 @@ public class ConditionalOnMissingBeanTests { ...@@ -456,8 +456,7 @@ public class ConditionalOnMissingBeanTests {
public void registerBeanDefinitions(AnnotationMetadata meta, BeanDefinitionRegistry registry) { public void registerBeanDefinitions(AnnotationMetadata meta, BeanDefinitionRegistry registry) {
BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(NonspecificFactoryBean.class); BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(NonspecificFactoryBean.class);
builder.addConstructorArgValue("foo"); builder.addConstructorArgValue("foo");
builder.getBeanDefinition().setAttribute(BeanTypeRegistry.FACTORY_BEAN_OBJECT_TYPE, builder.getBeanDefinition().setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, ExampleBean.class.getName());
ExampleBean.class.getName());
registry.registerBeanDefinition("exampleBeanFactoryBean", builder.getBeanDefinition()); registry.registerBeanDefinition("exampleBeanFactoryBean", builder.getBeanDefinition());
} }
......
...@@ -78,8 +78,6 @@ import org.springframework.util.StringUtils; ...@@ -78,8 +78,6 @@ import org.springframework.util.StringUtils;
public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAdapter public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAdapter
implements BeanClassLoaderAware, BeanFactoryAware, BeanFactoryPostProcessor, Ordered { implements BeanClassLoaderAware, BeanFactoryAware, BeanFactoryPostProcessor, Ordered {
private static final String FACTORY_BEAN_OBJECT_TYPE = "factoryBeanObjectType";
private static final String BEAN_NAME = MockitoPostProcessor.class.getName(); private static final String BEAN_NAME = MockitoPostProcessor.class.getName();
private static final String CONFIGURATION_CLASS_ATTRIBUTE = Conventions private static final String CONFIGURATION_CLASS_ATTRIBUTE = Conventions
...@@ -254,7 +252,7 @@ public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAda ...@@ -254,7 +252,7 @@ public class MockitoPostProcessor extends InstantiationAwareBeanPostProcessorAda
for (String beanName : beanFactory.getBeanNamesForType(FactoryBean.class)) { for (String beanName : beanFactory.getBeanNamesForType(FactoryBean.class)) {
beanName = BeanFactoryUtils.transformedBeanName(beanName); beanName = BeanFactoryUtils.transformedBeanName(beanName);
BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName); BeanDefinition beanDefinition = beanFactory.getBeanDefinition(beanName);
if (typeName.equals(beanDefinition.getAttribute(FACTORY_BEAN_OBJECT_TYPE))) { if (typeName.equals(beanDefinition.getAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE))) {
beans.add(beanName); beans.add(beanName);
} }
} }
......
...@@ -67,7 +67,7 @@ class MockitoPostProcessorTests { ...@@ -67,7 +67,7 @@ class MockitoPostProcessorTests {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(); AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
MockitoPostProcessor.register(context); MockitoPostProcessor.register(context);
RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(TestFactoryBean.class); RootBeanDefinition factoryBeanDefinition = new RootBeanDefinition(TestFactoryBean.class);
factoryBeanDefinition.setAttribute("factoryBeanObjectType", SomeInterface.class.getName()); factoryBeanDefinition.setAttribute(FactoryBean.OBJECT_TYPE_ATTRIBUTE, SomeInterface.class.getName());
context.registerBeanDefinition("beanToBeMocked", factoryBeanDefinition); context.registerBeanDefinition("beanToBeMocked", factoryBeanDefinition);
context.register(MockedFactoryBean.class); context.register(MockedFactoryBean.class);
context.refresh(); context.refresh();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment