Register functional rather than reflective bean definitions where possible
Closes gh-14516
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user