Register functional rather than reflective bean definitions where possible

Closes gh-14516
This commit is contained in:
Andy Wilkinson
2018-09-19 19:59:09 +01:00
parent 65295e0e14
commit efae363974
3 changed files with 22 additions and 15 deletions

View File

@@ -23,9 +23,9 @@ import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.RuntimeBeanReference;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.boot.type.classreading.ConcurrentReferenceCachingMetadataReaderFactory;
import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ApplicationListener;
@@ -85,8 +85,10 @@ class SharedMetadataReaderFactoryContextInitializer
}
private void register(BeanDefinitionRegistry registry) {
RootBeanDefinition definition = new RootBeanDefinition(
SharedMetadataReaderFactoryBean.class);
BeanDefinition definition = BeanDefinitionBuilder
.genericBeanDefinition(SharedMetadataReaderFactoryBean.class,
SharedMetadataReaderFactoryBean::new)
.getBeanDefinition();
registry.registerBeanDefinition(BEAN_NAME, definition);
}

View File

@@ -38,6 +38,7 @@ import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.DefaultListableBeanFactory;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.core.ResolvableType;
@@ -93,8 +94,11 @@ final class BeanTypeRegistry implements SmartInitializingSingleton {
Assert.isTrue(listableBeanFactory.isAllowEagerClassLoading(),
"Bean factory must allow eager class loading");
if (!listableBeanFactory.containsLocalBean(BEAN_NAME)) {
BeanDefinition bd = new RootBeanDefinition(BeanTypeRegistry.class);
bd.getConstructorArgumentValues().addIndexedArgumentValue(0, beanFactory);
BeanDefinition bd = BeanDefinitionBuilder
.genericBeanDefinition(BeanTypeRegistry.class,
() -> new BeanTypeRegistry(
(DefaultListableBeanFactory) beanFactory))
.getBeanDefinition();
listableBeanFactory.registerBeanDefinition(BEAN_NAME, bd);
}

View File

@@ -19,13 +19,14 @@ package org.springframework.boot.autoconfigure.webservices;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.beans.factory.config.ConstructorArgumentValues;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
import org.springframework.beans.factory.support.RootBeanDefinition;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@@ -118,8 +119,9 @@ public class WebServicesAutoConfiguration {
.orElse(Collections.emptyList());
for (String wsdlLocation : wsdlLocations) {
registerBeans(wsdlLocation, "*.wsdl", SimpleWsdl11Definition.class,
registry);
registerBeans(wsdlLocation, "*.xsd", SimpleXsdSchema.class, registry);
SimpleWsdl11Definition::new, registry);
registerBeans(wsdlLocation, "*.xsd", SimpleXsdSchema.class,
SimpleXsdSchema::new, registry);
}
}
@@ -128,13 +130,12 @@ public class WebServicesAutoConfiguration {
throws BeansException {
}
private void registerBeans(String location, String pattern, Class<?> type,
BeanDefinitionRegistry registry) {
private <T> void registerBeans(String location, String pattern, Class<T> type,
Function<Resource, T> beanSupplier, BeanDefinitionRegistry registry) {
for (Resource resource : getResources(location, pattern)) {
RootBeanDefinition beanDefinition = new RootBeanDefinition(type);
ConstructorArgumentValues constructorArguments = new ConstructorArgumentValues();
constructorArguments.addIndexedArgumentValue(0, resource);
beanDefinition.setConstructorArgumentValues(constructorArguments);
BeanDefinition beanDefinition = BeanDefinitionBuilder
.genericBeanDefinition(type, () -> beanSupplier.apply(resource))
.getBeanDefinition();
registry.registerBeanDefinition(
StringUtils.stripFilenameExtension(resource.getFilename()),
beanDefinition);