Commit ff9f5fd1 authored by Phillip Webb's avatar Phillip Webb

Polish OnBeanCondition

Polish `OnBeanCondition` and make it easier to remove `BeanTypeRegistry`
in the future.

See gh-17594
parent ff9d0cf4
...@@ -81,7 +81,7 @@ abstract class FilteringSpringBootCondition extends SpringBootCondition ...@@ -81,7 +81,7 @@ abstract class FilteringSpringBootCondition extends SpringBootCondition
this.beanClassLoader = classLoader; this.beanClassLoader = classLoader;
} }
protected List<String> filter(Collection<String> classNames, ClassNameFilter classNameFilter, protected final List<String> filter(Collection<String> classNames, ClassNameFilter classNameFilter,
ClassLoader classLoader) { ClassLoader classLoader) {
if (CollectionUtils.isEmpty(classNames)) { if (CollectionUtils.isEmpty(classNames)) {
return Collections.emptyList(); return Collections.emptyList();
...@@ -95,6 +95,22 @@ abstract class FilteringSpringBootCondition extends SpringBootCondition ...@@ -95,6 +95,22 @@ abstract class FilteringSpringBootCondition extends SpringBootCondition
return matches; return matches;
} }
/**
* Slightly faster variant of {@link ClassUtils#forName(String, ClassLoader)} that
* doesn't deal with primitives, arrays or innter types.
* @param className the class name to resolve
* @param classLoader the class loader to use
* @return a resolved class
* @throws ClassNotFoundException if the class cannot be found
*/
protected static Class<?> resolve(String className, ClassLoader classLoader) throws ClassNotFoundException {
if (classLoader != null) {
return classLoader.loadClass(className);
}
return Class.forName(className);
}
protected enum ClassNameFilter { protected enum ClassNameFilter {
PRESENT { PRESENT {
...@@ -122,7 +138,7 @@ abstract class FilteringSpringBootCondition extends SpringBootCondition ...@@ -122,7 +138,7 @@ abstract class FilteringSpringBootCondition extends SpringBootCondition
classLoader = ClassUtils.getDefaultClassLoader(); classLoader = ClassUtils.getDefaultClassLoader();
} }
try { try {
forName(className, classLoader); resolve(className, classLoader);
return true; return true;
} }
catch (Throwable ex) { catch (Throwable ex) {
...@@ -130,13 +146,6 @@ abstract class FilteringSpringBootCondition extends SpringBootCondition ...@@ -130,13 +146,6 @@ abstract class FilteringSpringBootCondition extends SpringBootCondition
} }
} }
private static Class<?> forName(String className, ClassLoader classLoader) throws ClassNotFoundException {
if (classLoader != null) {
return classLoader.loadClass(className);
}
return Class.forName(className);
}
} }
} }
...@@ -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(OnBeanCondition.FACTORY_BEAN_OBJECT_TYPE, ExampleBean.class); builder.getBeanDefinition().setAttribute(BeanTypeRegistry.FACTORY_BEAN_OBJECT_TYPE, ExampleBean.class);
registry.registerBeanDefinition("exampleBeanFactoryBean", builder.getBeanDefinition()); registry.registerBeanDefinition("exampleBeanFactoryBean", builder.getBeanDefinition());
} }
...@@ -456,7 +456,7 @@ public class ConditionalOnMissingBeanTests { ...@@ -456,7 +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(OnBeanCondition.FACTORY_BEAN_OBJECT_TYPE, builder.getBeanDefinition().setAttribute(BeanTypeRegistry.FACTORY_BEAN_OBJECT_TYPE,
ExampleBean.class.getName()); ExampleBean.class.getName());
registry.registerBeanDefinition("exampleBeanFactoryBean", builder.getBeanDefinition()); registry.registerBeanDefinition("exampleBeanFactoryBean", builder.getBeanDefinition());
} }
...@@ -513,7 +513,7 @@ public class ConditionalOnMissingBeanTests { ...@@ -513,7 +513,7 @@ public class ConditionalOnMissingBeanTests {
@Bean @Bean
@ConditionalOnMissingBean(value = ExampleBean.class, @ConditionalOnMissingBean(value = ExampleBean.class,
ignoredType = "org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBeanTests.CustomExampleBean") ignoredType = "org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBeanTests$CustomExampleBean")
ExampleBean exampleBean() { ExampleBean exampleBean() {
return new ExampleBean("test"); return new ExampleBean("test");
} }
......
...@@ -171,7 +171,7 @@ class ConditionalOnSingleCandidateTests { ...@@ -171,7 +171,7 @@ class ConditionalOnSingleCandidateTests {
} }
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnSingleCandidate(value = String.class, type = "java.lang.String") @ConditionalOnSingleCandidate(value = String.class, type = "java.lang.Integer")
static class OnBeanSingleCandidateTwoTypesConfiguration { static class OnBeanSingleCandidateTwoTypesConfiguration {
} }
......
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